# Copyright 2022 The Pigweed Authors
#
# 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
#
#     https://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.
"""Calls to build code."""

from recipe_engine import recipe_api


class PipelineApi(recipe_api.RecipeApi):
    """Calls to build code."""

    def __init__(self, props, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self._enabled = props.inside_a_pipeline
        self._round = props.round
        self._prev_iteration_builds = props.builds_from_previous_iteration

    @property
    def in_pipeline(self):
        return self._enabled

    @property
    def round(self):
        return self._round if self._enabled else None

    @property
    def builds_from_previous_iteration(self):
        return tuple(self._prev_iteration_builds) if self._enabled else None
