Code Generators - Quick Start Guide

Copy Markdown View Source

This library includes six production-ready code generators that translate ActorSimulation DSL into different languages and frameworks.

Single-File Script Examples

Following Fly.io's single-file Elixir pattern, you can generate complete projects with just Mix.install!

OMNeT++ (Network Simulation)

#!/usr/bin/env elixir
Mix.install([{:gen_server_virtual_time, "~> 0.2.0"}])

simulation = ActorSimulation.new()
  |> ActorSimulation.add_actor(:sender,
      send_pattern: {:periodic, 100, :msg},
      targets: [:receiver])
  |> ActorSimulation.add_actor(:receiver)

{:ok, files} = ActorSimulation.OMNeTPPGenerator.generate(simulation,
  network_name: "SimpleNetwork")

ActorSimulation.OMNeTPPGenerator.write_to_directory(files, "omnetpp_out/")

CAF (C++ Actor Framework)

#!/usr/bin/env elixir
Mix.install([{:gen_server_virtual_time, "~> 0.2.0"}])

simulation = ActorSimulation.new()
  |> ActorSimulation.add_actor(:worker,
      send_pattern: {:rate, 50, :task},
      targets: [:processor])
  |> ActorSimulation.add_actor(:processor)

{:ok, files} = ActorSimulation.CAFGenerator.generate(simulation,
  project_name: "MyActors",
  enable_callbacks: true)  # Callback interfaces!

ActorSimulation.CAFGenerator.write_to_directory(files, "caf_out/")

Pony (Capabilities-Secure)

#!/usr/bin/env elixir
Mix.install([{:gen_server_virtual_time, "~> 0.2.0"}])

simulation = ActorSimulation.new()
  |> ActorSimulation.add_actor(:sender,
      send_pattern: {:burst, 10, 1000, :batch},
      targets: [:receiver])
  |> ActorSimulation.add_actor(:receiver)

{:ok, files} = ActorSimulation.PonyGenerator.generate(simulation,
  project_name: "my_actors",
  enable_callbacks: true)

ActorSimulation.PonyGenerator.write_to_directory(files, "pony_out/")

Phony (Go Actors)

#!/usr/bin/env elixir
Mix.install([{:gen_server_virtual_time, "~> 0.2.0"}])

simulation = ActorSimulation.new()
  |> ActorSimulation.add_actor(:worker,
      send_pattern: {:periodic, 100, :tick},
      targets: [:processor])
  |> ActorSimulation.add_actor(:processor)

{:ok, files} = ActorSimulation.PhonyGenerator.generate(simulation,
  project_name: "my_actors",
  enable_callbacks: true)

ActorSimulation.PhonyGenerator.write_to_directory(files, "phony_out/")

Ractor (Rust Actors)

#!/usr/bin/env elixir
Mix.install([{:gen_server_virtual_time, "~> 0.2.0"}])

simulation = ActorSimulation.new()
  |> ActorSimulation.add_actor(:producer,
      send_pattern: {:rate, 100, :data},
      targets: [:consumer])
  |> ActorSimulation.add_actor(:consumer)

{:ok, files} = ActorSimulation.RactorGenerator.generate(simulation,
  project_name: "my_actors",
  enable_callbacks: true)

ActorSimulation.RactorGenerator.write_to_directory(files, "ractor_out/")

VLINGO XOOM (Java Actors)

#!/usr/bin/env elixir
Mix.install([{:gen_server_virtual_time, "~> 0.2.0"}])

simulation = ActorSimulation.new()
  |> ActorSimulation.add_actor(:publisher,
      send_pattern: {:periodic, 100, :event},
      targets: [:subscriber])
  |> ActorSimulation.add_actor(:subscriber)

{:ok, files} = ActorSimulation.VlingoGenerator.generate(simulation,
  project_name: "my-actors",
  group_id: "com.example",
  enable_callbacks: true)

ActorSimulation.VlingoGenerator.write_to_directory(files, "vlingo_out/")

Complete Examples

See the repository's examples/ directory for complete single-file scripts:

Comparison

GeneratorPurposeOutputKey Feature
OMNeT++Network simulationNED + C++GUI tools, INET framework
CAFProduction actorsC++ + Catch2Callback interfaces
PonySafe concurrencyType-safe actorsData-race freedom
PhonyGo actorsGo + testsZero-allocation messaging
RactorRust actorsRust + CargoGen_server-inspired, OTP-style supervision
VLINGOJava actorsJava + MavenProtocol actors, type-safe

Development Workflow

  1. Prototype in Elixir (fast iteration)
  2. Test with virtual time (deterministic)
  3. Visualize with sequence diagrams
  4. Generate to your target language
  5. Deploy to production

Why Single-File Scripts?

Benefits of using Mix.install for code generation:

✅ Portable - One file, no setup required
✅ Reproducible - Same input = same output
✅ Shareable - GitHub gist, email, anywhere
✅ Isolated - No impact on your main projects
✅ Fast - Generate code in seconds

Perfect for:

  • Bug reports with minimal examples
  • Quick prototyping
  • CI/CD pipelines
  • Teaching and demos

Learn More

Next Steps

  1. Try a single-file example
  2. Choose your target framework
  3. Generate production code
  4. Customize via callbacks
  5. Deploy with confidence!