Created
July 19, 2023 13:20
-
-
Save dnovais/9e8bc1c08386911c045d85ea93ab2ff7 to your computer and use it in GitHub Desktop.
Poc - DSL - Ruby generate Crystal
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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