ProtoRune. Lexicon. Generator
(proto_rune v0.5.2)
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
Functions
@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 filesoutput_dir: Directory where generated modules will be written
Returns
{:ok, count}- Number of modules generated{:error, reason}- If generation fails
@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
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"
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"