require "mruby_gem_scaffolding/version" module MrubyGemScaffolding module Utility class << self # from thor gem def snake_case(str) return str.downcase if str =~ /^[A-Z_]+$/ str.gsub(/\B[A-Z]/, '_\&').squeeze("_") =~ /_*(.*)/ Regexp.last_match(-1).downcase end # from thor gem def camel_case(str) return str if str !~ /_/ && str =~ /[A-Z]+.*/ str.split("_").map(&:capitalize).join end end end class << self def empty_project { "README.md" => '', "mrbgem.rake" => '', "include" => {}, "mrblib" => {}, "src" => {}, "tools" => {}, "test" => {}, "LICENSE" => '', } end def generate(user_name:, project_name:) result = empty_project result["README.md"] = < #include // defining the function to be later bound to a ruby method static mrb_value hello_world(mrb_state *mrb, mrb_value self) { printf("Hello World\\n"); return mrb_nil_value(); // return null } // gem initializer void mrb_#{Utility.snake_case(project_name)}_gem_init(mrb_state* mrb) { struct RClass *#{Utility.snake_case(project_name)}_class = mrb_define_module(mrb, "#{Utility.camel_case(project_name)}"); mrb_define_class_method( mrb, // Mruby VM state #{Utility.snake_case(project_name)}_class, // Class we bind method to "say_hello", // Name of method hello_world, // Function we are binding as a method MRB_ARGS_NONE() // How many arguments are optional/required ); } // gem finalizer void mrb_#{Utility.snake_case(project_name)}_gem_final(mrb_state* mrb) { } MULTILINE result["mrblib"]["#{Utility.snake_case(project_name)}.rb"] = <