Skip to content

Instantly share code, notes, and snippets.

@dnovais
Created July 19, 2023 13:20
Show Gist options
  • Save dnovais/9e8bc1c08386911c045d85ea93ab2ff7 to your computer and use it in GitHub Desktop.
Save dnovais/9e8bc1c08386911c045d85ea93ab2ff7 to your computer and use it in GitHub Desktop.
Poc - DSL - Ruby generate Crystal
class CrystalDSL
attr_reader :code
def initialize(&block)
@code = ''
instance_eval(&block) if block_given?
end
def generate(&block)
instance_eval(&block) if block_given?
end
def module(name, &block)
@code += "module #{name}\n"
instance_eval(&block) if block_given?
@code += "end\n"
end
def klass(name, &block)
@code += "class #{name}\n"
instance_eval(&block) if block_given?
@code += "end\n"
end
def initialize_method(parameter, type, &block)
@code += "def initialize(#{parameter} : #{type})\n"
instance_eval(&block) if block_given?
@code += "end\n"
end
def method(name, &block)
@code += "def #{name}\n"
instance_eval(&block) if block_given?
@code += "end\n"
end
def usage_example(&block)
@code += "# Usage example\n"
instance_eval(&block) if block_given?
end
def instance_creation(klass, arguments)
@code += "instance = #{klass}.new(#{arguments})\n"
end
def method_call(method)
@code += "instance.#{method}\n"
end
end
# Define the Crystal code using the DSL
crystal_code = CrystalDSL.new do
generate do
module 'MyModule' do
klass 'Person' do
initialize_method('name', 'String') do
# Custom initialization code can be added here
end
method 'greet' do
@code += "puts \"Hello, \#{@name}!\"\n"
end
end
end
usage_example do
instance_creation('MyModule::Person', '"John"')
method_call('greet')
end
end
end
# Print the generated Crystal code
puts crystal_code.code
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment