Commit e7d7574

mo khan <mo.khan@gmail.com>
2020-06-13 15:17:45
Use scim-kit visitor
1 parent e5bfdb0
Changed files (3)
app
spec
factories
app/models/scim/search.rb
@@ -2,50 +2,6 @@
 
 module Scim
   class Search
-    class Node
-      def initialize(hash)
-        @hash = hash
-      end
-
-      def operator
-        self[:operator].to_sym
-      end
-
-      def attribute
-        self[:attribute].to_s
-      end
-
-      def value
-        self[:value].to_s[1..-2]
-      end
-
-      def not?
-        @hash.key?(:not)
-      end
-
-      def accept(visitor)
-        visitor.visit(self)
-      end
-
-      def left
-        self.class.new(self[:left])
-      end
-
-      def right
-        self.class.new(self[:right])
-      end
-
-      def inspect
-        @hash.inspect
-      end
-
-      private
-
-      def [](key)
-        @hash[key]
-      end
-    end
-
     def initialize(clazz)
       @clazz = clazz
     end
@@ -53,8 +9,9 @@ module Scim
     def for(filter)
       return @clazz.all if filter.blank?
 
-      node = Scim::Search::Node.new(::Scim::Kit::V2::Filter.new.parse(filter))
-      node.accept(Scim::Visitor.new(@clazz, @clazz.scim_mapper))
+      ::Scim::Kit::V2::Filter
+        .parse(filter)
+        .accept(Scim::Visitor.new(@clazz, @clazz.scim_mapper))
     end
   end
 end
app/models/scim/visitor.rb
@@ -1,37 +1,15 @@
 # frozen_string_literal: true
 
 module Scim
-  class Visitor
+  class Visitor < Scim::Kit::V2::Filter::Visitor
     include Varkon
-    VISITORS = {
-      and: :visit_and,
-      co: :visit_contains,
-      eq: :visit_equals,
-      ew: :visit_ends_with,
-      ge: :visit_greater_than_equals,
-      gt: :visit_greater_than,
-      le: :visit_less_than_equals,
-      lt: :visit_less_than,
-      ne: :visit_not_equals,
-      or: :visit_or,
-      pr: :visit_presence,
-      sw: :visit_starts_with,
-    }.freeze
 
     def initialize(clazz, mapper = {})
       @clazz = clazz
       @mapper = mapper
     end
 
-    def visit(node)
-      visitor_for(node).call(node)
-    end
-
-    private
-
-    def visitor_for(node)
-      method(VISITORS.fetch(node.operator, :visit_unknown))
-    end
+    protected
 
     def visit_and(node)
       visit(node.left).merge(visit(node.right))
spec/factories/scim.rb
@@ -1,7 +1,7 @@
 # frozen_string_literal: true
 
 FactoryBot.define do
-  factory :scim_user, class: SCIM::User do
+  factory :scim_user, class: 'SCIM::User' do
     schemas { ["urn:ietf:params:scim:schemas:core:2.0:User"] }
     userName { FFaker::Internet.email }
     locale { I18n.available_locales.sample.to_s }