#! /your/favourite/path/to/ruby # -*- coding: utf-8 -*- # Copyright (c) 2014 Urabe, Shyouhei. All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # - Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # # - Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in # the documentation and/or other materials provided with the # distribution. # # - Neither the name of Internet Society, IETF or IETF Trust, nor the # names of specific contributors, may be used to endorse or promote # products derived from this software without specific prior written # permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. # @abstract # The Values, as described in RFC8259 section 3. # # > value = false / null / true / object / array / number / string class RFC8259::Value # Parse the AST from parser, and convert into corrsponding values. # @param [::Array] ast the AST, generated by the parser # @return [Value] evaluated instance # @raise [ArgumentError] malformed input # # @note the input MUST be a tree. No cyclic lists, nor even direct-acycric # graphs are allowed by definition. Such input can cause undefined # behaviour. def self.from_ast ast klass = case ast.first when :false then RFC8259::False when :null then RFC8259::Null when :true then RFC8259::True when :object then RFC8259::Object when :array then RFC8259::Array when :number then RFC8259::Number when :string then RFC8259::String end return klass.from_ast ast end # convert to Ruby's value def plain_old_ruby_object raise RuntimeError, 'abstruct method called' end # @return [::String] the class in string def inspect sprintf "#<%p>", self.class end # For pretty print (require 'pp' beforehand) # @param [PP] pp the pp def pretty_print pp pp.object_group self do end # nothing end end # *WARN* order matters, do not move below. require_relative 'false' require_relative 'null' require_relative 'true' require_relative 'object' require_relative 'array' require_relative 'number' require_relative 'string' # # Local Variables: # mode: ruby # coding: utf-8-unix # indent-tabs-mode: t # tab-width: 3 # ruby-indent-level: 3 # fill-column: 79 # default-justification: full # End: