# typed: strict
# ----------------------------------------------------------------------------
#
#  Welcome to Baml! To use this generated code, please run the following:
#
#  $ gem install baml
#
# ----------------------------------------------------------------------------

# This file was generated by BAML: please do not edit it. Instead, edit the
# BAML files and re-generate this code using: baml-cli generate
# baml-cli is available with the baml package.
# gem install baml
require "sorbet-runtime"
require "baml"

module BamlClient

  module Types

  class Check < T::Struct
      extend T::Sig

      const :name, String
      const :expr, String
      const :status, String
  end

  class Checked < T::Struct
      extend T::Sig
      extend T::Generic
      Value = type_member
      const :value, Value
      const :checks, T::Hash[Symbol, Check]
  end
  # #########################################################################
  # Generated enums (21)
  # #########################################################################

  class AliasedEnum < T::Enum
      enums do
          KEY_ONE = new("KEY_ONE")
          KEY_TWO = new("KEY_TWO")
      end
  end

  class Category < T::Enum
      enums do
          Refund = new("Refund")
          CancelOrder = new("CancelOrder")
          TechnicalSupport = new("TechnicalSupport")
          AccountIssue = new("AccountIssue")
          Question = new("Question")
      end
  end

  class Category2 < T::Enum
      enums do
          Refund = new("Refund")
          CancelOrder = new("CancelOrder")
          TechnicalSupport = new("TechnicalSupport")
          AccountIssue = new("AccountIssue")
          Question = new("Question")
      end
  end

  class Category3 < T::Enum
      enums do
          Refund = new("Refund")
          CancelOrder = new("CancelOrder")
          TechnicalSupport = new("TechnicalSupport")
          AccountIssue = new("AccountIssue")
          Question = new("Question")
      end
  end

  class Color < T::Enum
      enums do
          RED = new("RED")
          BLUE = new("BLUE")
          GREEN = new("GREEN")
          YELLOW = new("YELLOW")
          BLACK = new("BLACK")
          WHITE = new("WHITE")
      end
  end

  class DataType < T::Enum
      enums do
          Resume = new("Resume")
          Event = new("Event")
      end
  end

  class DynEnumOne < T::Enum
  end

  class DynEnumThree < T::Enum
      enums do
          TRICYCLE = new("TRICYCLE")
          TRIANGLE = new("TRIANGLE")
      end
  end

  class DynEnumTwo < T::Enum
  end

  class EnumInClass < T::Enum
      enums do
          ONE = new("ONE")
          TWO = new("TWO")
      end
  end

  class EnumOutput < T::Enum
      # An enum with three values,
  # ONE, TWO and THREE.

      enums do
          # The first enum.
          ONE = new("ONE")
          # The second enum.
          TWO = new("TWO")
          THREE = new("THREE")
      end
  end

  class Hobby < T::Enum
      enums do
          SPORTS = new("SPORTS")
          MUSIC = new("MUSIC")
          READING = new("READING")
      end
  end

  class MapKey < T::Enum
      enums do
          A = new("A")
          B = new("B")
          C = new("C")
      end
  end

  class NamedArgsSingleEnum < T::Enum
      enums do
          ONE = new("ONE")
          TWO = new("TWO")
      end
  end

  class NamedArgsSingleEnumList < T::Enum
      enums do
          ONE = new("ONE")
          TWO = new("TWO")
      end
  end

  class OptionalTest_CategoryType < T::Enum
      enums do
          Aleph = new("Aleph")
          Beta = new("Beta")
          Gamma = new("Gamma")
      end
  end

  class OrderStatus < T::Enum
      enums do
          ORDERED = new("ORDERED")
          SHIPPED = new("SHIPPED")
          DELIVERED = new("DELIVERED")
          CANCELLED = new("CANCELLED")
      end
  end

  class RenderStatusEnum < T::Enum
      enums do
          ACTIVE = new("ACTIVE")
          INACTIVE = new("INACTIVE")
      end
  end

  class RenderTestEnum < T::Enum
      enums do
          BIKE = new("BIKE")
          SCOOTER = new("SCOOTER")
      end
  end

  class Tag < T::Enum
      enums do
          Security = new("Security")
          AI = new("AI")
          Blockchain = new("Blockchain")
      end
  end

  class TestEnum < T::Enum
      enums do
          A = new("A")
          B = new("B")
          C = new("C")
          D = new("D")
          E = new("E")
          F = new("F")
          G = new("G")
      end
  end

  # #########################################################################
  # Generated classes (104)
  # #########################################################################


  class AddTodoItem < T::Struct
      include Baml::Sorbet::Struct
      const :type, String
      const :item, String
      const :time, String
      const :description, String
  end


  class AnotherObject < T::Struct
      include Baml::Sorbet::Struct
      const :id, String
      const :thingy2, String
      const :thingy3, String
  end


  class BigNumbers < T::Struct
      include Baml::Sorbet::Struct
      const :a, Integer
      const :b, Float
  end


  class BinaryNode < T::Struct
      include Baml::Sorbet::Struct
      const :data, Integer
      const :left, T.nilable(BinaryNode)
      const :right, T.nilable(BinaryNode)
  end


  class Blah < T::Struct
      include Baml::Sorbet::Struct
      const :prop4, T.nilable(String)
  end


  class BlockConstraint < T::Struct
      include Baml::Sorbet::Struct
      const :foo, Integer
      const :bar, String
  end


  class BlockConstraintForParam < T::Struct
      include Baml::Sorbet::Struct
      const :bcfp, Integer
      const :bcfp2, String
  end


  class BookOrder < T::Struct
      include Baml::Sorbet::Struct
      const :orderId, String
      const :title, String
      const :quantity, Integer
      const :price, Float
  end


  class ClassForNullLiteral < T::Struct
      include Baml::Sorbet::Struct
      const :a, String
  end


  class ClassOptionalOutput < T::Struct
      include Baml::Sorbet::Struct
      const :prop1, String
      const :prop2, String
  end


  class ClassOptionalOutput2 < T::Struct
      include Baml::Sorbet::Struct
      const :prop1, T.nilable(String)
      const :prop2, T.nilable(String)
      const :prop3, T.nilable(Blah)
  end


  class ClassToRecAlias < T::Struct
      include Baml::Sorbet::Struct
      const :list, LinkedListAliasNode
  end


  class ClassWithBlockDone < T::Struct
      include Baml::Sorbet::Struct
      const :i_16_digits, Integer
      const :s_20_words, String
  end


  class ClassWithImage < T::Struct
      include Baml::Sorbet::Struct
      const :myImage, Baml::Image
      const :param2, String
      const :fake_image, FakeImage
  end


  class ClassWithoutDone < T::Struct
      include Baml::Sorbet::Struct
      const :i_16_digits, Integer
      const :s_20_words, String
  end


  class ClientDetails1559 < T::Struct
      include Baml::Sorbet::Struct
      const :client_name, T.nilable(String)
      const :client_address, T.nilable(String)
      const :client_postal_code, T.nilable(String)
      const :client_city, T.nilable(String)
      const :client_country, T.nilable(String)
      const :client_phone, T.nilable(String)
      const :client_email, T.nilable(String)
  end


  class ComplexMemoryObject < T::Struct
      include Baml::Sorbet::Struct
      const :id, String
      const :name, String
      const :description, String
      const :metadata, T::Array[T.any(String, Integer, Float)]
  end


  class CompoundBigNumbers < T::Struct
      include Baml::Sorbet::Struct
      const :big, BigNumbers
      const :big_nums, T::Array[BigNumbers]
      const :another, BigNumbers
  end


  class ContactInfo < T::Struct
      include Baml::Sorbet::Struct
      const :primary, T.any(PhoneNumber, EmailAddress)
      const :secondary, T.nilable(T.any(PhoneNumber, EmailAddress))
  end


  class CustomStory < T::Struct
      include Baml::Sorbet::Struct
      const :title, String
      const :characters, T::Array[String]
      const :content, String
  end


  class CustomTaskResult < T::Struct
      include Baml::Sorbet::Struct
      const :bookOrder, T.nilable(BookOrder)
      const :flightConfirmation, T.nilable(FlightConfirmation)
      const :groceryReceipt, T.nilable(GroceryReceipt)
  end


  class Document1559 < T::Struct
      include Baml::Sorbet::Struct
      const :client_details, ClientDetails1559
      const :notes, T::Array[Note1599]
  end


  class DummyJsonTodo < T::Struct
      include Baml::Sorbet::Struct
      const :id, Integer
      const :todo, String
      const :completed, T::Boolean
      const :userId, Integer
  end


  class DummyOutput < T::Struct
      include Baml::Sorbet::Struct
      const :nonce, String
      const :nonce2, String
  end


  class DynInputOutput < T::Struct
      include Baml::Sorbet::Struct
      const :testKey, String
  end


  class DynamicClassOne < T::Struct
      include Baml::Sorbet::Struct
  end


  class DynamicClassTwo < T::Struct
      include Baml::Sorbet::Struct
      const :hi, String
      const :some_class, SomeClassNestedDynamic
      const :status, T.any(DynEnumOne, String)
  end


  class DynamicOutput < T::Struct
      include Baml::Sorbet::Struct
  end


  class DynamicSchema < T::Struct
      include Baml::Sorbet::Struct
  end


  class Earthling < T::Struct
      include Baml::Sorbet::Struct
      const :age, Checked[Integer]
  end


  class Education < T::Struct
      include Baml::Sorbet::Struct
      const :institution, String
      const :location, String
      const :degree, String
      const :major, T::Array[String]
      const :graduation_date, T.nilable(String)
  end


  class Email < T::Struct
      include Baml::Sorbet::Struct
      const :subject, String
      const :body, String
      const :from_address, String
  end


  class EmailAddress < T::Struct
      include Baml::Sorbet::Struct
      const :value, String
  end


  class Event < T::Struct
      include Baml::Sorbet::Struct
      const :title, String
      const :date, String
      const :location, String
      const :description, String
  end


  class FakeImage < T::Struct
      include Baml::Sorbet::Struct
      const :url, String
  end


  class FlightConfirmation < T::Struct
      include Baml::Sorbet::Struct
      const :confirmationNumber, String
      const :flightNumber, String
      const :departureTime, String
      const :arrivalTime, String
      const :seatNumber, String
  end


  class FooAny < T::Struct
      include Baml::Sorbet::Struct
      const :planetary_age, T.any(Martian, Earthling)
      const :certainty, Checked[Integer]
      const :species, Checked[String]
  end


  class Forest < T::Struct
      include Baml::Sorbet::Struct
      const :trees, T::Array[Tree]
  end


  class FormatterTest0 < T::Struct
      include Baml::Sorbet::Struct
      const :lorem, String
      const :ipsum, String
  end


  class FormatterTest1 < T::Struct
      include Baml::Sorbet::Struct
      const :lorem, String
      const :ipsum, String
  end


  class FormatterTest2 < T::Struct
      include Baml::Sorbet::Struct
      const :lorem, String
      const :ipsum, String
  end


  class FormatterTest3 < T::Struct
      include Baml::Sorbet::Struct
      const :lorem, String
      const :ipsum, String
  end


  class GroceryReceipt < T::Struct
      include Baml::Sorbet::Struct
      const :receiptId, String
      const :storeName, String
      const :items, T::Array[T.any(String, Integer, Float)]
      const :totalAmount, Float
  end


  class Haiku < T::Struct
      include Baml::Sorbet::Struct
      const :line1, String
      const :line2, String
      const :line3, String
  end


  class InnerClass < T::Struct
      include Baml::Sorbet::Struct
      const :prop1, String
      const :prop2, String
      const :inner, InnerClass2
  end


  class InnerClass2 < T::Struct
      include Baml::Sorbet::Struct
      const :prop2, Integer
      const :prop3, Float
  end


  class InputClass < T::Struct
      include Baml::Sorbet::Struct
      const :key, String
      const :key2, String
  end


  class InputClassNested < T::Struct
      include Baml::Sorbet::Struct
      const :key, String
      const :nested, InputClass
  end


  class LinkedList < T::Struct
      include Baml::Sorbet::Struct
      const :head, T.nilable(Node)
      const :len, Integer
  end


  class LinkedListAliasNode < T::Struct
      include Baml::Sorbet::Struct
      const :value, Integer
      const :next, T.nilable(LinkedListAliasNode)
  end


  class LiteralClassHello < T::Struct
      include Baml::Sorbet::Struct
      const :prop, String
  end


  class LiteralClassOne < T::Struct
      include Baml::Sorbet::Struct
      const :prop, String
  end


  class LiteralClassTwo < T::Struct
      include Baml::Sorbet::Struct
      const :prop, String
  end


  class MaintainFieldOrder < T::Struct
      include Baml::Sorbet::Struct
      const :a, String
      const :b, String
      const :c, String
  end


  class MalformedConstraints < T::Struct
      include Baml::Sorbet::Struct
      const :foo, Checked[Integer]
  end


  class MalformedConstraints2 < T::Struct
      include Baml::Sorbet::Struct
      const :foo, Integer
  end


  # A Martian organism with an age.
  # Such a nice type.
  class Martian < T::Struct
      include Baml::Sorbet::Struct
      # The age of the Martian in Mars years.
      # So many Mars years.

      const :age, Checked[Integer]
  end


  class MemoryObject < T::Struct
      include Baml::Sorbet::Struct
      const :id, String
      const :name, String
      const :description, String
  end


  class MergeAttrs < T::Struct
      include Baml::Sorbet::Struct
      const :amount, Checked[Integer]
  end


  class NamedArgsSingleClass < T::Struct
      include Baml::Sorbet::Struct
      const :key, String
      const :key_two, T::Boolean
      const :key_three, Integer
  end


  class Nested < T::Struct
      include Baml::Sorbet::Struct
      const :prop3, T.nilable(String)
      const :prop4, T.nilable(String)
      const :prop20, Nested2
  end


  class Nested2 < T::Struct
      include Baml::Sorbet::Struct
      const :prop11, T.nilable(String)
      const :prop12, T.nilable(String)
  end


  class NestedBlockConstraint < T::Struct
      include Baml::Sorbet::Struct
      const :nbc, Checked[BlockConstraint]
  end


  class NestedBlockConstraintForParam < T::Struct
      include Baml::Sorbet::Struct
      const :nbcfp, BlockConstraintForParam
  end


  class Node < T::Struct
      include Baml::Sorbet::Struct
      const :data, Integer
      const :next, T.nilable(Node)
  end


  class NodeWithAliasIndirection < T::Struct
      include Baml::Sorbet::Struct
      const :value, Integer
      const :next, T.nilable(NodeWithAliasIndirection)
  end


  class Note1599 < T::Struct
      include Baml::Sorbet::Struct
      const :note_title, String
      const :note_description, T.nilable(String)
      const :note_amount, T.nilable(String)
  end


  class OptionalListAndMap < T::Struct
      include Baml::Sorbet::Struct
      const :p, T.nilable(T::Array[String])
      const :q, T.nilable(T::Hash[String, String])
  end


  class OptionalTest_Prop1 < T::Struct
      include Baml::Sorbet::Struct
      const :omega_a, String
      const :omega_b, Integer
  end


  class OptionalTest_ReturnType < T::Struct
      include Baml::Sorbet::Struct
      const :omega_1, T.nilable(OptionalTest_Prop1)
      const :omega_2, T.nilable(String)
      const :omega_3, T::Array[T.nilable(OptionalTest_CategoryType)]
  end


  class OrderInfo < T::Struct
      include Baml::Sorbet::Struct
      const :order_status, OrderStatus
      const :tracking_number, T.nilable(String)
      const :estimated_arrival_date, T.nilable(String)
  end


  class OriginalA < T::Struct
      include Baml::Sorbet::Struct
      const :value, Integer
  end


  class OriginalB < T::Struct
      include Baml::Sorbet::Struct
      const :value, Integer
  end


  class Person < T::Struct
      include Baml::Sorbet::Struct
      const :name, T.nilable(String)
      const :hair_color, T.nilable(T.any(Color, String))
  end


  class PhoneNumber < T::Struct
      include Baml::Sorbet::Struct
      const :value, String
  end


  class Quantity < T::Struct
      include Baml::Sorbet::Struct
      const :amount, T.any(Integer, Float)
      const :unit, T.nilable(String)
  end


  class RaysData < T::Struct
      include Baml::Sorbet::Struct
      const :dataType, DataType
      const :value, T.any(Resume, Event)
  end


  class ReceiptInfo < T::Struct
      include Baml::Sorbet::Struct
      const :items, T::Array[ReceiptItem]
      const :total_cost, T.nilable(Float)
      const :venue, T.any(String, String)
  end


  class ReceiptItem < T::Struct
      include Baml::Sorbet::Struct
      const :name, String
      const :description, T.nilable(String)
      const :quantity, Integer
      const :price, Float
  end


  class Recipe < T::Struct
      include Baml::Sorbet::Struct
      const :ingredients, T::Hash[String, Quantity]
      const :recipe_type, T.any(String, String)
  end


  class RecursiveAliasDependency < T::Struct
      include Baml::Sorbet::Struct
      const :value, JsonValue
  end


  class RenderEnumInput < T::Struct
      include Baml::Sorbet::Struct
      const :testKey, String
  end


  class RenderTestClass < T::Struct
      include Baml::Sorbet::Struct
      const :name, String
      const :status, T.any(RenderStatusEnum, String)
  end


  class Resume < T::Struct
      include Baml::Sorbet::Struct
      const :name, String
      const :email, String
      const :phone, String
      const :experience, T::Array[String]
      const :education, T::Array[Education]
      const :skills, T::Array[String]
  end


  class Schema < T::Struct
      include Baml::Sorbet::Struct
      const :prop1, T.nilable(String)
      const :prop2, T.any(Nested, String)
      const :prop5, T::Array[T.nilable(String)]
      const :prop6, T.any(String, T::Array[Nested])
      const :nested_attrs, T::Array[T.nilable(T.any(String, Nested))]
      const :parens, T.nilable(String)
      const :other_group, T.any(String, Integer)
  end


  class SearchParams < T::Struct
      include Baml::Sorbet::Struct
      const :dateRange, T.nilable(Integer)
      const :location, T::Array[String]
      const :jobTitle, T.nilable(WithReasoning)
      const :company, T.nilable(WithReasoning)
      const :description, T::Array[WithReasoning]
      const :tags, T::Array[T.any(Tag, String)]
  end


  class SemanticContainer < T::Struct
      include Baml::Sorbet::Struct
      const :sixteen_digit_number, Integer
      const :string_with_twenty_words, String
      const :class_1, ClassWithoutDone
      const :class_2, ClassWithBlockDone
      const :class_done_needed, ClassWithBlockDone
      const :class_needed, ClassWithoutDone
      const :three_small_things, T::Array[SmallThing]
      const :final_string, String
  end


  class SimpleTag < T::Struct
      include Baml::Sorbet::Struct
      const :field, String
  end


  class SmallThing < T::Struct
      include Baml::Sorbet::Struct
      const :i_16_digits, Integer
      const :i_8_digits, Integer
  end


  class SomeClassNestedDynamic < T::Struct
      include Baml::Sorbet::Struct
      const :hi, String
  end


  class StringToClassEntry < T::Struct
      include Baml::Sorbet::Struct
      const :word, String
  end


  class TestClassAlias < T::Struct
      include Baml::Sorbet::Struct
      const :key, String
      const :key2, String
      const :key3, String
      const :key4, String
      const :key5, String
  end


  class TestClassNested < T::Struct
      include Baml::Sorbet::Struct
      const :prop1, String
      const :prop2, InnerClass
  end


  class TestClassWithEnum < T::Struct
      include Baml::Sorbet::Struct
      const :prop1, String
      const :prop2, EnumInClass
  end


  class TestMemoryOutput < T::Struct
      include Baml::Sorbet::Struct
      const :items, T::Array[T.any(MemoryObject, ComplexMemoryObject, AnotherObject)]
      const :more_items, T::Array[T.any(MemoryObject, ComplexMemoryObject, AnotherObject)]
  end


  class TestOutputClass < T::Struct
      include Baml::Sorbet::Struct
      const :prop1, String
      const :prop2, Integer
  end


  class TodoMessageToUser < T::Struct
      include Baml::Sorbet::Struct
      const :type, String
      const :message, String
  end


  class Tree < T::Struct
      include Baml::Sorbet::Struct
      const :data, Integer
      const :children, Forest
  end


  class TwoStoriesOneTitle < T::Struct
      include Baml::Sorbet::Struct
      const :title, String
      const :story_a, String
      const :story_b, String
  end


  class TwoStoriesOneTitleCheck < T::Struct
      include Baml::Sorbet::Struct
      const :title, String
      const :story_a, Checked[String]
      const :story_b, Checked[String]
  end


  class UnionTest_ReturnType < T::Struct
      include Baml::Sorbet::Struct
      const :prop1, T.any(String, T::Boolean)
      const :prop2, T::Array[T.any(Float, T::Boolean)]
      const :prop3, T.any(T::Array[T::Boolean], T::Array[Integer])
  end


  # my docs
  class UniverseQuestion < T::Struct
      include Baml::Sorbet::Struct
      const :question, String
      const :answer, String
  end


  class UniverseQuestionInput < T::Struct
      include Baml::Sorbet::Struct
      const :question, String
  end


  class WithReasoning < T::Struct
      include Baml::Sorbet::Struct
      const :value, String
      const :reasoning, String
  end

  # #########################################################################
  # Generated type aliases (21)
  # #########################################################################


  Amount = T.type_alias{ Integer }


  Combination = T.type_alias{ T.any(Integer, String, T::Boolean, Float, T::Array[String], T::Hash[String, T::Array[String]]) }


  Currency = T.type_alias{ Checked[Integer] }


  Graph = T.type_alias{ T::Hash[String, T::Array[String]] }


  JsonArray = T.type_alias{ T::Array[JsonValue] }


  JsonEntry = T.type_alias{ T.any(SimpleTag, JsonTemplate) }


  JsonObject = T.type_alias{ T::Hash[String, JsonValue] }


  JsonTemplate = T.type_alias{ T::Hash[String, JsonEntry] }


  JsonValue = T.type_alias{ T.any(Integer, String, T::Boolean, Float, JsonObject, JsonArray) }


  LinkedListAlias = T.type_alias{ LinkedListAliasNode }


  List = T.type_alias{ T::Array[String] }


  MultipleAttrs = T.type_alias{ Checked[Integer] }


  NodeIndirection = T.type_alias{ NodeWithAliasIndirection }


  Primitive = T.type_alias{ T.any(Integer, String, T::Boolean, Float) }


  RecAliasOne = T.type_alias{ RecAliasTwo }


  RecAliasThree = T.type_alias{ T::Array[RecAliasOne] }


  RecAliasTwo = T.type_alias{ RecAliasThree }


  RecursiveListAlias = T.type_alias{ T::Array[T.anything] }


  RecursiveMapAlias = T.type_alias{ T::Hash[String, T.anything] }


  RecursiveUnion = T.type_alias{ T.any(String, T::Hash[String, T.anything]) }


  TodoTool = T.type_alias{ T.any(AddTodoItem, TodoMessageToUser) }


  end


end
