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