#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You 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.
#

from apache_beam.options import pipeline_options


class YamlOptions(pipeline_options.PipelineOptions):
  @classmethod
  def _add_argparse_args(cls, parser):
    parser.add_argument(
        '--yaml_experimental_features',
        dest='yaml_experimental_features',
        action='append',
        default=[],
        help=('Enable yaml features ahead of them being declared stable.'))

  @classmethod
  def check_enabled(cls, pipeline, feature, description=None):
    if feature not in pipeline._options.view_as(cls).yaml_experimental_features:
      raise ValueError(
          f'{description or feature} unsupported because '
          f'{feature} is not set in --yaml_experimental_features option.')
