Merge branch '8087-arv-cli-request-body-from-file' of https://github.com/wtsi-hgi...
authorradhika <radhika@curoverse.com>
Thu, 17 Mar 2016 17:14:52 +0000 (13:14 -0400)
committerradhika <radhika@curoverse.com>
Thu, 17 Mar 2016 17:14:52 +0000 (13:14 -0400)
sdk/cli/bin/arv

index 185a5b0673f1dc1c5afc5ed6530386d8255daaf4..da65b07bf0525b29047f2207543bc63e5fd2d851 100755 (executable)
@@ -559,7 +559,11 @@ def parse_arguments(discovery_document, subcommands)
         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
         }
@@ -625,6 +629,38 @@ end
 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
   }