module OracleSqlParser::Grammar::Expression

grammar Case
  rule case_expression
    case_keyword space? case_expression:(simple_case_expression / searched_case_expression) space?
    else_clause:else_clause? space? end_keyword {
      def ast
        ast = case_expression.ast
        ast.else_clause = else_clause.ast
        ast
      end
    }
  end

  rule simple_case_expression
    expr space w:(when_keyword space comparison_expr space then_keyword space? return_expr space?)+ {
      def ast
        OracleSqlParser::Ast::SimpleCaseExpression[
          :condition => expr.ast,
          :when_clauses => OracleSqlParser::Ast::Array[*when_clauses]
        ]
      end

      def when_clauses
        w.elements.map do |elem|
          OracleSqlParser::Ast::Hash[
            :when_expr => elem.comparison_expr.ast,
            :return_expr => elem.return_expr.ast
          ]
        end
      end
    }
  end

  rule comparison_expr
    expr {
      def ast
        super
      end
    }
  end

  rule return_expr
    expr {
      def ast
        super
      end
    }
  end

  rule else_expr
    expr {
      def ast
        super
      end
    }
  end

  rule searched_case_expression
    when_keyword space? condition space? then_keyword space? return_expr {
      def ast
        OracleSqlParser::Ast::SearchedCaseExpression[
          :when_condition => condition.ast,
          :return_expr => return_expr.ast
        ]
      end
    }
  end

  rule else_clause
    else_keyword space? else_expr {
      def ast
        else_expr.ast
      end
    }
  end
end

end