module Rews
# models Restrictions for find_* operations
# on Folder::BaseFolderId
#
# takes restrictions written in Ruby s-expressions and
# outputs Exchange Web Services Restriction XML. e.g.
#
# [[:and, [:==, "item:Subject", "hello"], [:>=, "item:DateTimeSent", DateTime.parse("2011-03-16T15:57:37+00:00")]]
class Restriction
attr_reader :expr
def initialize(expr)
@expr = expr
end
def inspect
"#<#{self.class} @expr=#{@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
expr[1..-1].each do |clause|
Xml::write_expr(xml, clause)
end
end
end
end
end
end