# Code generated by Lark OpenAPI.

from typing import Any, Optional, Union, Dict, List, Set, IO, Callable, Type
from lark_oapi.core.construct import init
from .pie import Pie
from .pie import Pie
from .trapezoid import Trapezoid
from .cube import Cube


class CompositeShape(object):
    _types = {
        "type": str,
        "pie": Pie,
        "circular_ring": Pie,
        "trapezoid": Trapezoid,
        "cube": Cube,
    }

    def __init__(self, d=None):
        self.type: Optional[str] = None
        self.pie: Optional[Pie] = None
        self.circular_ring: Optional[Pie] = None
        self.trapezoid: Optional[Trapezoid] = None
        self.cube: Optional[Cube] = None
        init(self, d, self._types)

    @staticmethod
    def builder() -> "CompositeShapeBuilder":
        return CompositeShapeBuilder()


class CompositeShapeBuilder(object):
    def __init__(self) -> None:
        self._composite_shape = CompositeShape()

    def type(self, type: str) -> "CompositeShapeBuilder":
        self._composite_shape.type = type
        return self

    def pie(self, pie: Pie) -> "CompositeShapeBuilder":
        self._composite_shape.pie = pie
        return self

    def circular_ring(self, circular_ring: Pie) -> "CompositeShapeBuilder":
        self._composite_shape.circular_ring = circular_ring
        return self

    def trapezoid(self, trapezoid: Trapezoid) -> "CompositeShapeBuilder":
        self._composite_shape.trapezoid = trapezoid
        return self

    def cube(self, cube: Cube) -> "CompositeShapeBuilder":
        self._composite_shape.cube = cube
        return self

    def build(self) -> "CompositeShape":
        return self._composite_shape
