Skip to content

matsumotory/mruby-config

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

46 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

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:

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published