cli
 1# frozen_string_literal: true
 2
 3require 'json_schemer'
 4require 'thor'
 5
 6require 'scim/kit/cli/app'
 7require 'scim/kit/cli/canonical_keys'
 8require 'scim/kit/cli/client'
 9require 'scim/kit/cli/discovery'
10require 'scim/kit/cli/reporter'
11require 'scim/kit/cli/resource_schema_resolver'
12require 'scim/kit/cli/resource_type_resolver'
13require 'scim/kit/cli/resource_validation'
14require 'scim/kit/cli/schema_registry'
15require 'scim/kit/cli/scim_schema_converter'
16require 'scim/kit/cli/settings'
17require 'scim/kit/cli/sparse_schema'
18require 'scim/kit/cli/unassigned_values'
19require 'scim/kit/cli/validator'
20
21module Scim
22  module Kit
23    module Cli
24      class Error < Scim::Kit::Error; end
25
26      class RequestFailed < Error
27        attr_reader :result
28
29        def initialize(result)
30          @result = result
31          super("request failed with status #{result.status.inspect}")
32        end
33      end
34
35      class UnknownResourceType < Error
36        def initialize(name, known_names)
37          super("unknown resource type #{name.inspect} (known: #{known_names.join(', ')})")
38        end
39      end
40
41      class MissingEndpoint < Error
42        def initialize(name)
43          super("resource type #{name.inspect} has no endpoint")
44        end
45      end
46
47      class InvalidResponse < Error; end
48
49      class InvalidOption < Error; end
50
51      # SCIM collection endpoints (/Schemas, /ResourceTypes) return a
52      # ListResponse per RFC 7644 section 4, but some servers return a
53      # bare array. Return the underlying array for either shape, or nil.
54      def self.collection(body)
55        return body if body.is_a?(Array)
56        return unless body.is_a?(Hash)
57
58        resources = body[:Resources]
59        resources if resources.is_a?(Array)
60      end
61    end
62  end
63end