X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=lib%2Frbot%2Fconfig.rb;h=23a445f978a5ccfeb245bb59aeac2834c521d2bd;hb=9996da20c88d45c34b8f1267b23b83ae1e1bbea3;hp=7ed019fe8dc48ce89c19d15099578a43309cfe77;hpb=6f5528a63b44e610a3d25d7fe583399163d7d2da;p=user%2Fhenk%2Fcode%2Fruby%2Frbot.git diff --git a/lib/rbot/config.rb b/lib/rbot/config.rb index 7ed019fe..23a445f9 100644 --- a/lib/rbot/config.rb +++ b/lib/rbot/config.rb @@ -63,18 +63,20 @@ module Config end def get return @manager.config[@key] if @manager.config.has_key?(@key) - return @default + return default end alias :value :get def set(value, on_change = true) @manager.config[@key] = value @manager.changed = true @on_change.call(@manager.bot, value) if on_change && @on_change + return self end def unset @manager.config.delete(@key) @manager.changed = true @on_change.call(@manager.bot, value) if @on_change + return self end # set string will raise ArgumentErrors on failed parse/validate @@ -96,16 +98,18 @@ module Config get.to_s end - private - def validate(value) - return true unless @validate - if @validate.instance_of?(Proc) - return @validate.call(value) - elsif @validate.instance_of?(Regexp) - raise ArgumentError, "validation via Regexp only supported for strings!" unless value.instance_of? String - return @validate.match(value) + protected + def validate(val, validator = @validate) + case validator + when false, nil + return true + when Proc + return validator.call(val) + when Regexp + raise ArgumentError, "validation via Regexp only supported for strings!" unless String === val + return validator.match(val) else - raise ArgumentError, "validation type #{@validate.class} not supported" + raise ArgumentError, "validation type #{validator.class} not supported" end end end @@ -157,6 +161,18 @@ module Config end class ArrayValue < Value + def initialize(key, params) + super + @validate_item = params[:validate_item] + @validate ||= Proc.new do |v| + !v.find { |i| !validate_item(i) } + end + end + + def validate_item(item) + validate(item, @validate_item) + end + def parse(string) string.split(/,\s+/) end @@ -164,8 +180,13 @@ module Config get.join(", ") end def add(val) - curval = self.get - set(curval + [val]) unless curval.include?(val) + newval = self.get.dup + unless newval.include? val + newval << val + validate_item(val) or raise ArgumentError, "invalid item: #{val}" + validate(newval) or raise ArgumentError, "invalid value: #{newval.to_s}" + set(newval) + end end def rm(val) curval = self.get @@ -268,9 +289,13 @@ module Config return false end - # TODO should I implement this via Value or leave it direct? - # def []=(key, value) - # end + def []=(key, value) + return @items[key.to_sym].set(value) if @items.has_key?(key.to_sym) + if @config.has_key?(key.to_sym) + warning _("Unregistered lookup #{key.to_sym.inspect}") + return @config[key.to_sym] = value + end + end # pass everything else through to the hash def method_missing(method, *args, &block)