No description, website, or topics provided.
C Ruby
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
example
src
.travis.yml
.travis_build_config.rb
README.md
mrbgem.rake

README.md

Config Module for mruby

With mruby we continuously switching between Ruby and C code. mruby-config gives you an easy way to maintain configuration values on both sides.

refs: http://blog.mruby.sh/201305220423.html

  • Kernel#{get,del,add,new}_config
  • Config#{get,del,add}
  • Kernel#{get,del,add,new}_sub_config
  • Config::Sub#{get,del,add}

install by mrbgems

  • add conf.gem line to build_config.rb
MRuby::Build.new do |conf|

    # ... (snip) ...

    conf.gem :git => 'https://github.com/matsumoto-r/mruby-config.git'
end

How to use

  • An example Ruby configuration mruby.conf

    new_config(
        "Listen"            => 80,
        "DocumentRoot"      => "/var/www/html",
        "ExtendedStatus"    => "On",
        "User"              => "apache",
        "Group"             => "apache",
    )
    
    sub_new_config tag1, {
        "Files"         => "index.cgi",
        "AccessLimit"   => 5
    }
    
    sub_add_config tag2, {
        "Files"       => "mt.cgi",
        "AccessLimit" => 1
    }
  • The corresponding C code to read the configuration values in C

    /*
    **
    ** gcc mconfig.c -I ../../mruby/include/ ../../mruby/build/host/lib/libmruby.a
    **
    */
    #include <stdio.h>
    #include "mruby.h"
    #include "mruby/variable.h"
    #include "mruby/hash.h"
    
    int main() {
    
      FILE *fp;
      if ((fp = fopen("./mruby.conf", "r")) == NULL)
        return 1;
    
      int port;
      char *droot;
      mrb_value user;
    
      char *tag1_file;
      mrb_value tag1_limit;
      int tag2_limit;
    
      mrb_state* mrb = mrb_open();
      mrb_load_file(mrb, fp);
    
      /*
      mrb_get_config_value(mrb, key, format, ...)
      mrb_get_sub_config_value(mrb, tag, key, format, ...)
      mrb_config_convert_value(mrb, val, format, ...)
    
      format specifiers (like mrb_get_args):
    
       o: Object [mrb_value]
       S: String [mrb_value]          //Not Implemented
       A: Array [mrb_value]           //Not Implemented
       H: Hash [mrb_value]            //Not Implemented
       s: String [char*,int]          //Not Implemented
       z: String [char*]
       a: Array [mrb_value*,mrb_int]  //Not Implemented
       f: Float [mrb_float]           //Not Implemented
       i: Integer [mrb_int]
      */
    
      // get a global configuration value by C data type
      mrb_get_config_value(mrb, "Listen",       "i", &port);
      mrb_get_config_value(mrb, "DocumentRoot", "z", &droot);
      mrb_get_config_value(mrb, "User",         "o", &user);
    
      // get a tag configuration value by C data type
      mrb_get_sub_config_value(mrb, "tag1", "Files",        "z", &tag1_file);
      mrb_get_sub_config_value(mrb, "tag1", "AccessLimit",  "o", &tag1_limit);
      mrb_get_sub_config_value(mrb, "tag2", "AccessLimit",  "i", &tag2_limit);
    
      // Implement code using configuration value in Ruby
    
      printf("=== global configuration ===\n");
      printf("port=%d droot=%s\n", port, droot);
      mrb_p(mrb, user);
      printf("\n");
    
      printf("=== tag configuration ===\n");
      printf("tag1_file=%s\n", tag1_file);
      mrb_p(mrb, tag1_limit);
      printf("tag2_limit=%d\n", tag2_limit);
    
      // convert mrb_value to any C data type vale
      int tag1_limit_c;
      mrb_config_convert_value(mrb, tag1_limit, "i", &tag1_limit_c);
      printf("tag1_limit=%d\n", tag1_limit_c);
    
      mrb_close(mrb);
    
      return 0;
    }

Other mruby-config method

  • To work on Ruby side with these values you can, create a new configuration value
new_config(
    "Listen"            => 80,
    "DocumentRoot"      => "/var/www/html",
    "User"              => "apache",
    "Group"             => "apache",
)
  • add or modify a new configuration value
add_config "ExtendedStatus" => "On"

or

Config::add "ExtendedStatus" => "On"
  • Delete configuration values
del_config "ExtendedStatus"

or

Config::del "ExtendedStatus"
  • Read out a configuration values
get_config "ExtendedStatus"

or

Config::get "ExtendedStatus"

or get all configureation values

get_config
  • To work on Ruby side with these values you can, create a new sub configuration value
new_sub_config tag1, {
    "Files"       => "mt.cgi",
    "AccessLimit" => 1
}
add_sub_config tag2, {
    "Files"       => "index.cgi",
    "AccessLimit" => 5
}
  • add or modify a new sub configuration value
add_sub_config "tag1", "Directory" => "/var/www/"

or

Config::Sub::add "tag1", "Directory" => "/var/www/"
  • Delete sub configuration values (NOT IMPLEMTED)
del_sub_config "hoge"

or

Config::Sub::del "hoge"
  • Read out a sub configuration values
get_sub_config "tag1", "AccessLimit"

or

Config::Sub::get "tag1", "AccessLimit"

or get sub all configureation values

get_sub_config "tag2"

License

under the MIT License: