Я читал статью о том, как создать простой DSL и анализировать файл, но он (и это справедливо) указывает на то, насколько это опасно, поскольку вы не можете действительно доверять тому, что получает eval ' ред.
Так это заставило меня задуматься, возможно ли сделать это безопасным?
С этой целью, возможно ли гарантировать, что в контексте выполнения доступны только методы DSL (и что конкретно было разрешено), и что вызовы других вещей просто ничего не сделают или не приведут к ошибке?
Код, используемый в примере:
class OrdersDsl
def initialize
@orders = { to_perform: [], to_schedule: [] }.freeze
end
def parse(order_filename)
instance_eval File.read(order_filename)
end
private
def order_now(order_name, *order_options)
@orders[:to_perform] << serialize_order(order_name, *order_options)
end
def schedule(order_name, *order_options)
@orders[:to_schedule] << serialize_order(order_name, *order_options)
end
def serialize_order(name, *options)
[name, *options]
end
def OrdersDsl.run(order_filename = 'Orders')
OrdersDsl.new.parse(order_filename)
end
end