class Vips::Introspect
def initialize name
def initialize name # if there's a trailing "!", this is a destructive version of an # operation if name[-1] == "!" @destructive = true # strip the trailing "!" @vips_name = name[0...-1] else @destructive = false @vips_name = name end @op = Operation.new @vips_name @args = [] @required_input = [] @optional_input = {} @required_output = [] @optional_output = {} # find all the arguments the operator can take @op.argument_map do |pspec, argument_class, _argument_instance| flags = argument_class[:flags] if (flags & ARGUMENT_CONSTRUCT) != 0 # names can include - as punctuation, but we always use _ in # Ruby arg_name = pspec[:name].tr("-", "_") @args << { arg_name: arg_name, flags: flags, gtype: pspec[:value_type] } end nil end @args.each do |details| arg_name = details[:arg_name] flags = details[:flags] if (flags & ARGUMENT_INPUT) != 0 if (flags & ARGUMENT_REQUIRED) != 0 && (flags & ARGUMENT_DEPRECATED) == 0 @required_input << details else # we allow deprecated optional args @optional_input[arg_name] = details end # MODIFY INPUT args count as OUTPUT as well in non-destructive mode if (flags & ARGUMENT_MODIFY) != 0 && !@destructive if (flags & ARGUMENT_REQUIRED) != 0 && (flags & ARGUMENT_DEPRECATED) == 0 @required_output << details else @optional_output[arg_name] = details end end elsif (flags & ARGUMENT_OUTPUT) != 0 if (flags & ARGUMENT_REQUIRED) != 0 && (flags & ARGUMENT_DEPRECATED) == 0 @required_output << details else # again, allow deprecated optional args @optional_output[arg_name] = details end end end # in destructive mode, the first required input arg must be MODIFY and # must be an image if @destructive if @required_input.length < 1 || @required_input[0][:flags] & ARGUMENT_MODIFY == 0 || @required_input[0][:gtype] != IMAGE_TYPE raise Vips::Error, "operation #{@vips_name} is not destructive" end end end