/*
 * Copyright 2015 Google Inc. All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef COBALT_CSS_PARSER_TRANSITION_SHORTHAND_PROPERTY_PARSE_STRUCTURES_H_
#define COBALT_CSS_PARSER_TRANSITION_SHORTHAND_PROPERTY_PARSE_STRUCTURES_H_

#include "base/optional.h"
#include "cobalt/cssom/property_definitions.h"
#include "cobalt/cssom/property_key_list_value.h"
#include "cobalt/cssom/time_list_value.h"
#include "cobalt/cssom/timing_function_list_value.h"

namespace cobalt {
namespace css_parser {

// This file contains a collection of structures used as synthetic values for
// different parser reductions related to the 'transition' shorthand property.

// The SingleTransition structure is the type used for the result of the
// single_transition parser reduction.
struct SingleTransitionShorthand {
  SingleTransitionShorthand() : error(false) {}

  void ReplaceNullWithInitialValues();

  base::optional<cssom::PropertyKey> property;
  base::optional<base::TimeDelta> duration;
  scoped_refptr<cssom::TimingFunction> timing_function;
  base::optional<base::TimeDelta> delay;

  bool error;
};

// As we are parsing a transition, maintain builders for all of its components.
struct TransitionShorthandBuilder {
  TransitionShorthandBuilder()
      : property_list_builder(new cssom::PropertyKeyListValue::Builder()),
        duration_list_builder(new cssom::TimeListValue::Builder()),
        timing_function_list_builder(
            new cssom::TimingFunctionListValue::Builder()),
        delay_list_builder(new cssom::TimeListValue::Builder()) {}

  scoped_ptr<cssom::PropertyKeyListValue::Builder> property_list_builder;
  scoped_ptr<cssom::TimeListValue::Builder> duration_list_builder;
  scoped_ptr<cssom::TimingFunctionListValue::Builder>
      timing_function_list_builder;
  scoped_ptr<cssom::TimeListValue::Builder> delay_list_builder;
};

struct TransitionShorthand {
  scoped_refptr<cssom::PropertyValue> property_list;
  scoped_refptr<cssom::PropertyValue> duration_list;
  scoped_refptr<cssom::PropertyValue> timing_function_list;
  scoped_refptr<cssom::PropertyValue> delay_list;
};

}  // namespace css_parser
}  // namespace cobalt

#endif  // COBALT_CSS_PARSER_TRANSITION_SHORTHAND_PROPERTY_PARSE_STRUCTURES_H_
