# typed: strict
# frozen_string_literal: true

module Tapioca
  class Config < T::Struct
    extend(T::Sig)

    const(:outdir, String)
    const(:prerequire, T.nilable(String))
    const(:postrequire, String)
    const(:generate_command, String)
    const(:exclude, T::Array[String])
    const(:typed_overrides, T::Hash[String, String])

    sig { returns(Pathname) }
    def outpath
      @outpath ||= T.let(Pathname.new(outdir), T.nilable(Pathname))
      T.must(@outpath)
    end

    private_class_method :new

    CONFIG_FILE_PATH = "sorbet/tapioca/config.yml"
    SORBET_CONFIG = "sorbet/config"

    DEFAULT_POSTREQUIRE = "sorbet/tapioca/require.rb"
    DEFAULT_OUTDIR = "sorbet/rbi/gems"
    DEFAULT_OVERRIDES = T.let({
      # ActiveSupport overrides some core methods with different signatures
      # so we generate a typed: false RBI for it to suppress errors
      "activesupport" => "false",
    }.freeze, T::Hash[String, String])
  end
end