Class: Aspera::Cli::Result

Inherits:
Object
  • Object
show all
Defined in:
lib/aspera/cli/result.rb,
lib/aspera/cli/result.rb

Overview

Special result types - each has its own class

Defined Under Namespace

Classes: Empty, Image, Nothing, Null, ObjectList, SingleObject, Special, Status, Success, Text, ValueList

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(data: nil, fields: nil) ⇒ Result

Returns a new instance of Result.

Parameters:

  • data (Object, nil) (defaults to: nil)

    The result data

  • fields (Object) (defaults to: nil)

    Specification of fields to include



25
26
27
28
# File 'lib/aspera/cli/result.rb', line 25

def initialize(data: nil, fields: nil)
  @data = data
  @fields = fields
end

Instance Attribute Details

#dataObject (readonly)

Returns the value of attribute data.



21
22
23
# File 'lib/aspera/cli/result.rb', line 21

def data
  @data
end

#fieldsObject (readonly)

Returns the value of attribute fields.



21
22
23
# File 'lib/aspera/cli/result.rb', line 21

def fields
  @fields
end

Class Method Details

.auto(data) ⇒ Result

Class method to automatically determine result type from data

Parameters:

  • data (Object)

    the data to analyze and format

Returns:



286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
# File 'lib/aspera/cli/result.rb', line 286

def auto(data)
  case data
  when NilClass
    Null.new
  when Hash
    SingleObject.new(data)
  when Array
    all_types = data.map(&:class).uniq
    return ObjectList.new(data) if all_types.eql?([Hash])

    scalar_types = [String, Integer, Symbol]
    unsupported_types = all_types - scalar_types
    return ValueList.new(data, name: 'list') if unsupported_types.empty?

    Aspera.error_unexpected_value(unsupported_types){'list item types'}
  when String, Integer, Symbol
    Text.new(data)
  else
    Aspera.error_unexpected_value(data.class.name){'result type'}
  end
end

Instance Method Details

#format(formatter) ⇒ void

This method returns an undefined value.

Format this result using the provided formatter This method implements the Visitor pattern, allowing each Result subclass to define how it should be formatted without the Formatter needing to know about all Result types. Base implementation handles common formats: text, nagios, ruby, json, jsonpp, yaml Subclasses should call super first, then handle their specific formats

Parameters:

  • formatter (Formatter)

    The formatter to use



38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
# File 'lib/aspera/cli/result.rb', line 38

def format(formatter)
  # Apply field filtering once for formats that need it
  filtered_data = formatter.filter_list_on_fields(@data)
  case formatter.format_type
  when :text
    formatter.display_message(:data, @data.to_s)
  when :nagios
    Nagios.process(@data)
  when :ruby
    formatter.display_message(:data, PP.pp(filtered_data, +''))
  when :json
    formatter.display_message(:data, JSON.generate(filtered_data))
  when :jsonpp
    formatter.display_message(:data, JSON.pretty_generate(filtered_data))
  when :yaml
    formatter.display_message(:data, YAML.dump(filtered_data))
  when :image
    if @data.nil?
      formatter.display_message(:data, formatter.special_format('null (no image)'))
      return
    end
    Aspera.assert_type(@data, String){'image: URL or blob'}
    # Check if URL
    data =
      begin
        # just validate
        URI.parse(@data)
        if Environment.instance.url_method.eql?(:text)
          UriReader.read(@data)
        else
          Environment.instance.open_uri(@data)
          formatter.display_message(:info, "Opened URL in browser: #{@data}")
          :done
        end
      rescue URI::InvalidURIError
        @data
      end
    # try base64
    data = begin
      Base64.strict_decode64(data)
    rescue
      data
    end
    # here, data is the image blob
    formatter.display_message(:data, Preview::Terminal.build(data, **formatter.image_options)) unless data.eql?(:done)
  else
    Aspera.error_unexpected_value(formatter.format_type){'format'}
  end
end