if body_object["required"] == false
is_required = false
end
- opt resource.to_sym, "#{resource} (request body)", {
+ _resource_opt_desc = "Either a string representing #{resource} as JSON or a filename from which to read #{resource} JSON (use '-' to read from stdin)."
+ if is_required
+ _resource_opt_desc += " This option must be specified."
+ end
+ opt resource.to_sym, _resource_opt_desc, {
required: is_required,
type: :string
}
request_parameters = {_profile:true}.merge(method_opts)
resource_body = request_parameters.delete(resource_schema.to_sym)
if resource_body
+ # check if resource_body is valid JSON by attempting to parse it
+ _is_json = true
+ begin
+ # we don't actually need the results of the parsing,
+ # just checking for the JSON::ParserError exception
+ JSON.parse resource_body
+ rescue JSON::ParserError => e
+ _is_json = false
+ end
+ _is_readable_file = false
+ # if resource_body is not valid JSON, it should be a filename (or '-' for stdin)
+ if resource_body == '-'
+ _is_readable_file = true
+ _resource_body_file = $stdin
+ elsif File.readable? resource_body
+ _is_readable_file = true
+ _resource_body_file = File.open(resource_body, 'r')
+ end
+ if _is_json and _is_readable_file
+ abort "Argument '#{resource_body}' specified for option '--#{resource_schema.to_sym}' is both valid JSON and a readable file, cannot continue (suggest renaming the file '#{resource_body}')."
+ elsif !_is_json and !_is_readable_file
+ if File.exists? resource_body
+ # specified file exists but is not readable
+ abort "File '#{resource_body}' specified for option '--#{resource_schema.to_sym}' exists but is not readable."
+ else
+ # specified file does not exist
+ abort "File '#{resource_body}' specified for option '--#{resource_schema.to_sym}' does not exist."
+ end
+ elsif _is_readable_file
+ resource_body = _resource_body_file.read()
+ _resource_body_file.close()
+ end
request_body = {
resource_schema => resource_body
}