///|
/// Server-side capability flags (each optional; advertised in initialize response).
pub(all) struct ServerCapabilities {
  mut tools_list_changed : Bool
  mut resources_subscribe : Bool
  mut resources_list_changed : Bool
  mut prompts_list_changed : Bool
  mut logging : Bool
} derive(Debug, Eq)

///|
/// Default capabilities: everything off. Use the builder methods to enable.
pub fn ServerCapabilities::new() -> ServerCapabilities {
  {
    tools_list_changed: false,
    resources_subscribe: false,
    resources_list_changed: false,
    prompts_list_changed: false,
    logging: false,
  }
}

///|
/// Encode [ServerCapabilities] to the JSON capabilities object.
pub fn ServerCapabilities::to_json(self : ServerCapabilities) -> Json {
  let obj : Map[String, Json] = Map([])
  if self.tools_list_changed {
    let tools_obj : Map[String, Json] = Map([])
    tools_obj["listChanged"] = Json::boolean(true)
    obj["tools"] = Json::object(tools_obj)
  }
  if self.resources_subscribe || self.resources_list_changed {
    let res_obj : Map[String, Json] = Map([])
    res_obj["subscribe"] = if self.resources_subscribe {
      Json::boolean(true)
    } else {
      Json::null()
    }
    res_obj["listChanged"] = if self.resources_list_changed {
      Json::boolean(true)
    } else {
      Json::null()
    }
    obj["resources"] = Json::object(res_obj)
  }
  if self.prompts_list_changed {
    let p_obj : Map[String, Json] = Map([])
    p_obj["listChanged"] = Json::boolean(true)
    obj["prompts"] = Json::object(p_obj)
  }
  if self.logging {
    obj["logging"] = Json::empty_object()
  }
  Json::object(obj)
}