///|
/// ProviderConfig: modelport's self-description of accepted config values.
/// A String array (not typed enum) because each provider has its own
/// vocabulary for e.g. reasoning_effort values.
pub(all) struct ProviderConfig {
  /// Accepted reasoning_effort values. Empty = not supported.
  reasoning_effort_values : Array[String]
} derive(Eq, Debug)

///|
pub fn ProviderConfig::ProviderConfig(
  reasoning_effort_values~ : Array[String],
) -> ProviderConfig {
  { reasoning_effort_values, }
}

///|
/// Empty config: no reasoning_effort values accepted.
pub fn ProviderConfig::empty() -> ProviderConfig {
  { reasoning_effort_values: [] }
}

///|
/// Check if the given reasoning_effort value is accepted.
pub fn ProviderConfig::accepts_reasoning_effort(
  self : ProviderConfig,
  value : String,
) -> Bool {
  self.reasoning_effort_values.contains(value)
}

///|
pub impl Show for ProviderConfig with fn to_string(self : ProviderConfig) -> String {
  let values = self.reasoning_effort_values
    .copy()
    .map(fn(s) { "'" + s + "'" })
    .join(", ")
  "ProviderConfig(reasoning_effort=[\{values}])"
}