# frozen_string_literal: truemoduleRainbowclassColorattr_reader:grounddefself.build(ground,values)unless[1,3].include?(values.size)raiseArgumentError,"Wrong number of arguments for color definition, should be 1 or 3"endcolor=values.size==1?values.first:valuescasecolor# NOTE: Properly handle versions before/after Ruby 2.4.0.# Ruby 2.4+ unifies Fixnum & Bignum into Integer.# However previous versions would still use Fixnum.# To avoid missing `Fixnum` input, call `0.class` which would# return either `Integer` or `Fixnum`.when0.classIndexed.new(ground,color)whenSymbolifNamed.color_names.include?(color)Named.new(ground,color)elsifX11Named.color_names.include?(color)X11Named.new(ground,color)elseraiseArgumentError,"Unknown color name, valid names: "+(Named.color_names+X11Named.color_names).join(', ')endwhenArrayRGB.new(ground,*color)whenStringRGB.new(ground,*parse_hex_color(color))endenddefself.parse_hex_color(hex)unlesshex=~/^#?[a-f0-9]{6}/iraiseArgumentError,"Invalid hexadecimal RGB triplet. Valid format: /^#?[a-f0-9]{6}/i"endhex=hex.sub(/^#/,'')r=hex[0..1].to_i(16)g=hex[2..3].to_i(16)b=hex[4..5].to_i(16)[r,g,b]endclassIndexed<Colorattr_reader:numdefinitialize(ground,num)@ground=ground@num=numenddefcodescode=num+(ground==:foreground?30:40)[code]endendclassNamed<IndexedNAMES={black: 0,red: 1,green: 2,yellow: 3,blue: 4,magenta: 5,cyan: 6,white: 7,default: 9}.freezedefself.color_namesNAMES.keysenddefself.valid_namescolor_names.join(', ')enddefinitialize(ground,name)unlessNamed.color_names.include?(name)raiseArgumentError,"Unknown color name, valid names: #{self.class.valid_names}"endsuper(ground,NAMES[name])endendclassRGB<Indexedattr_reader:r,:g,:bdefself.to_ansi_domain(value)(6*(value/256.0)).to_ienddefinitialize(ground,*values)ifvalues.min.negative?||values.max>255raiseArgumentError,"RGB value outside 0-255 range"endsuper(ground,8)@r,@g,@b=valuesenddefcodessuper+[5,code_from_rgb]endprivatedefcode_from_rgb16+self.class.to_ansi_domain(r)*36+self.class.to_ansi_domain(g)*6+self.class.to_ansi_domain(b)endendclassX11Named<RGBincludeX11ColorNamesdefself.color_namesNAMES.keysenddefself.valid_namescolor_names.join(', ')enddefinitialize(ground,name)unlessX11Named.color_names.include?(name)raiseArgumentError,"Unknown color name, valid names: #{self.class.valid_names}"endsuper(ground,*NAMES[name])endendendend