Sha256: 68cb62b282b77be8483868a9c7151b7ed0ffdb9d0ce630a2349b41d79eaadc91

Contents?: true

Size: 1.91 KB

Versions: 1

Compression:

Stored size: 1.91 KB

Contents

# takes restrictions written in Ruby s-expressions and 
# outputs Exchange Web Services Restriction XML
#
#
module Rews
  class Restriction

    attr_reader :expr

    def initialize(expr)
      @expr = expr
    end

    def inspect
      "#{self.class}: #{@expr.inspect}"
    end

    def to_xml
      Xml::write_restriction(expr)
    end

    module Xml
      module_function

      def write_restriction(expr)
        xml = Builder::XmlMarkup.new
        xml.wsdl :Restriction do
          write_expr(xml, expr)
        end
        xml.target!
      end

      def write_expr(xml, expr)
        case expr[0]
        when :<, :<=, :==, :>=, :>, :"!=" then
          write_comparison(xml, expr)
        when :and, :or, :not then
          write_logical(xml, expr)
        else
          raise "unknown operator: #{expr[0]}"
        end
      end

      COMPARISON_OPS = {
        :< => :IsLessThan,
        :<= => :IsLessThanOrEqualTo,
        :== => :IsEqualTo,
        :>= => :IsGreaterThanOrEqualTo,
        :> => :IsGreaterThan,
        :"!=" => :IsNotEqualTo}
      
      def write_comparison(xml, expr)
        xml.t COMPARISON_OPS[expr[0]] do
          write_field_uri(xml, expr[1])
          write_field_uri_or_constant(xml, expr[2])
        end
      end

      def write_field_uri_or_constant(xml, expr)
        xml.t :FieldURIOrConstant do
          if expr.is_a?(Array) && expr[0] == :field_uri
            write_field_uri(xml, expr[1])
          else
            write_constant(xml, expr)
          end
        end
      end

      def write_field_uri(xml, expr)
        xml.t :FieldURI, :FieldURI=>expr
      end

      def write_constant(xml, expr)
        xml.t :Constant, :Value=>expr
      end

      LOGICAL_OPS = {
        :and => :And,
        :or => :Or,
        :not => :Not
      }
      def write_logical(xml, expr)
        xml.t LOGICAL_OPS[expr[0]] do
          write_xml(xml ,expr[1..-1])
        end
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
rews-0.1.0 lib/rews/restriction.rb