ProtoRune.Lexicon.Generator (proto_rune v0.2.0)

Copy Markdown

Generates Elixir modules with Peri schemas from AT Protocol lexicon definitions.

This module is responsible for:

  • Parsing lexicon JSON files
  • Converting lexicon types to Peri schema definitions using TypeMapper
  • Generating Elixir module source code
  • Writing generated modules to disk

Example

# Generate a module for app.bsky.feed.post
{:ok, source} = Generator.generate_module(lexicon_map)
File.write!("lib/proto_rune/lexicon/generated/app/bsky/feed/post.ex", source)

Summary

Functions

Generates all lexicon modules from a directory of JSON files.

Generates Elixir module source code from a lexicon definition.

Converts a lexicon ID (e.g., "app.bsky.feed.post") to an Elixir module name.

Calculates the file path for a generated module based on its ID.

Types

generation_result()

@type generation_result() :: {:ok, String.t()} | {:error, term()}

lexicon()

@type lexicon() :: map()

Functions

generate_all(lexicons_dir, output_dir)

@spec generate_all(String.t(), String.t()) ::
  {:ok, non_neg_integer()} | {:error, term()}

Generates all lexicon modules from a directory of JSON files.

Parameters

  • lexicons_dir: Directory containing lexicon JSON files
  • output_dir: Directory where generated modules will be written

Returns

  • {:ok, count} - Number of modules generated
  • {:error, reason} - If generation fails

generate_module(lexicon)

@spec generate_module(lexicon()) :: generation_result()

Generates Elixir module source code from a lexicon definition.

Parameters

  • lexicon: A map containing the parsed lexicon definition

Returns

  • {:ok, source_code} - The generated Elixir module as a string
  • {:error, reason} - If generation fails

id_to_module_name(id)

@spec id_to_module_name(String.t()) :: String.t()

Converts a lexicon ID (e.g., "app.bsky.feed.post") to an Elixir module name.

Examples

iex> Generator.id_to_module_name("app.bsky.feed.post")
"ProtoRune.Lexicon.App.Bsky.Feed.Post"

iex> Generator.id_to_module_name("com.atproto.repo.strongRef")
"ProtoRune.Lexicon.Com.Atproto.Repo.StrongRef"

module_file_path(id, output_dir)

@spec module_file_path(String.t(), String.t()) :: String.t()

Calculates the file path for a generated module based on its ID.

Examples

iex> Generator.module_file_path("app.bsky.feed.post", "/path/to/generated")
"/path/to/generated/app/bsky/feed/post.ex"