Class: OmnifocusMcp::Tools::Operations::GetPerspectiveView

Inherits:
Object
  • Object
show all
Defined in:
lib/omnifocus_mcp/tools/operations/get_perspective_view.rb

Constant Summary collapse

DEFAULT_LIMIT =
100

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(script_runner: Infrastructure::ScriptRunner, generator: Generators::PerspectiveView) ⇒ GetPerspectiveView

Returns a new instance of GetPerspectiveView.



45
46
47
48
# File 'lib/omnifocus_mcp/tools/operations/get_perspective_view.rb', line 45

def initialize(script_runner: Infrastructure::ScriptRunner, generator: Generators::PerspectiveView)
  @script_runner = script_runner
  @generator = generator
end

Class Method Details

.call(params = nil, script_runner: Infrastructure::ScriptRunner, **kwargs) ⇒ Object



16
17
18
19
# File 'lib/omnifocus_mcp/tools/operations/get_perspective_view.rb', line 16

def call(params = nil, script_runner: Infrastructure::ScriptRunner, **kwargs)
  params = merge_params(params, kwargs)
  new(script_runner:).call(params)
end

.classify_response(response:, fields:, limit:) ⇒ Object



23
24
25
# File 'lib/omnifocus_mcp/tools/operations/get_perspective_view.rb', line 23

def classify_response(response:, fields:, limit:)
  new.classify_response(response:, fields:, limit:)
end

.normalize_limit(value) ⇒ Object



21
# File 'lib/omnifocus_mcp/tools/operations/get_perspective_view.rb', line 21

def normalize_limit(value) = new.normalize_limit(value)

.project_fields(items:, fields:) ⇒ Object



31
32
33
# File 'lib/omnifocus_mcp/tools/operations/get_perspective_view.rb', line 31

def project_fields(items:, fields:)
  new.project_fields(items:, fields:)
end

.shape_items(items:, fields:, limit:) ⇒ Object



27
28
29
# File 'lib/omnifocus_mcp/tools/operations/get_perspective_view.rb', line 27

def shape_items(items:, fields:, limit:)
  new.shape_items(items:, fields:, limit:)
end

Instance Method Details

#call(params) ⇒ Object



50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# File 'lib/omnifocus_mcp/tools/operations/get_perspective_view.rb', line 50

def call(params)
  Params::McpBoundary.coerce(Params::GetPerspectiveViewParams, params).then do |params|
    perspective_name = params.perspective_name.to_s
    return OmnifocusMcp::Result.error("Perspective name is required") if Utils::Blank.blank?(perspective_name)

    limit = normalize_limit(params.limit)
    fields = params.fields
    args = generator.args(perspective_name:, limit:)

    script_runner.execute_omnifocus_script(generator.script_path, args:)
                 .and_then { |response| classify_response(response:, fields:, limit:) }
  end
rescue StandardError => e
  OmnifocusMcp.logger.warn("[get_perspective_view] Error: #{e}")
  OmnifocusMcp::Result.error(e.message || "Unknown error occurred")
end

#classify_response(response:, fields:, limit:) ⇒ Object



74
75
76
77
78
79
80
81
82
83
84
85
86
87
# File 'lib/omnifocus_mcp/tools/operations/get_perspective_view.rb', line 74

def classify_response(response:, fields:, limit:)
  shape = response.is_a?(Hash) ? response.transform_keys(&:to_sym) : nil

  case shape
  in { error: String => msg }
    OmnifocusMcp::Result.error(msg)
  in { items: Array => items }
    OmnifocusMcp::Result.ok(shape_items(items:, fields:, limit:))
  in Hash
    OmnifocusMcp::Result.ok([])
  in nil
    OmnifocusMcp::Result.error("Unexpected response from getPerspectiveView.js: #{response.inspect}")
  end
end

#normalize_limit(value) ⇒ Object



67
68
69
70
71
72
# File 'lib/omnifocus_mcp/tools/operations/get_perspective_view.rb', line 67

def normalize_limit(value)
  return DEFAULT_LIMIT if value.nil?
  return value if value.is_a?(Integer) && value.positive?

  DEFAULT_LIMIT
end

#project_fields(items:, fields:) ⇒ Object



95
96
97
98
99
100
101
102
103
104
# File 'lib/omnifocus_mcp/tools/operations/get_perspective_view.rb', line 95

def project_fields(items:, fields:)
  string_fields = fields.map(&:to_s)
  items.map do |item|
    next item unless item.is_a?(Hash)

    string_fields.each_with_object({}) do |field, projected|
      projected[field] = item[field] if item.key?(field)
    end
  end
end

#shape_items(items:, fields:, limit:) ⇒ Object



89
90
91
92
93
# File 'lib/omnifocus_mcp/tools/operations/get_perspective_view.rb', line 89

def shape_items(items:, fields:, limit:)
  items = project_fields(items:, fields:) if fields && !fields.empty?
  items = items.first(limit) if items.length > limit
  items
end