///|
/// Full discovery result, including cache hints and server identity metadata.
pub(all) struct DiscoverResult {
  supported_versions : Array[String]
  capabilities : ServerCapabilities
  instructions : String?
  metadata : ResultMetadata
} derive(Debug, Eq)

///|
pub fn DiscoverResult::new(
  supported_versions : Array[String],
  capabilities : ServerCapabilities,
  instructions? : String,
  metadata~ : ResultMetadata = ResultMetadata::empty(),
) -> DiscoverResult {
  { supported_versions, capabilities, instructions, metadata, }
}

///|
pub fn DiscoverResult::from_json(value : Json) -> DiscoverResult raise MCPError {
  let fields = wire_object(value)
  let supported_versions = wire_optional_strings(fields, "supportedVersions").unwrap_or_else(() => {
      raise InvalidParams("Missing supportedVersions")
    },
  )
  let capabilities = match fields.get("capabilities") {
    Some(value) => ServerCapabilities::from_json(value)
    None => raise InvalidParams("Missing capabilities")
  }
  {
    supported_versions,
    capabilities,
    instructions: wire_optional_string(fields, "instructions"),
    metadata: ResultMetadata::from_json(value, body_fields=[
      "supportedVersions", "capabilities", "instructions",
    ]),
  }
}

///|
pub impl ToJson for DiscoverResult with fn to_json(self) {
  let fields = self.metadata.to_fields()
  fields.set("supportedVersions", Json(self.supported_versions))
  fields.set("capabilities", self.capabilities.to_json())
  fields.remove("instructions")
  wire_put_string(fields, "instructions", self.instructions)
  Json::object(fields)
}

///|
pub extend DiscoverResult with ToJson::{to_json}

///|
pub extend DiscoverResult with Eq::{equal, not_equal}

///|
pub extend DiscoverResult with @moonbitlang/core/debug.Debug::{to_repr}