// GENERATED by tools/gen — DO NOT EDIT.

///|
fn[T : ToJson] parameter_value(value : T) -> String {
  match Json(value) {
    String(value) => value
    True => "true"
    False => "false"
    Number(value, repr~) =>
      match repr {
        Some(text) => text
        None => value.to_string()
      }
    other => other.stringify()
  }
}

///|
fn parse_json_body(body : Bytes) -> Json raise {
  @json.parse(@utf8.decode(body))
}

///|
fn[T : @json.FromJson] decode_response(
  response : @http.Response,
) -> T raise @runtime.SdkError {
  @json.from_json(parse_json_body(response.body)) catch {
    error =>
      raise @runtime.Decode(message=error.to_string(), body=response.body)
  }
}

///|
///
/// Create a Message
pub fn messages_post_request(
  body : CreateMessageParams,
  anthropic_version? : String,
  anthropic_user_profile_id? : String,
  anthropic_workspace_id? : String,
) -> @http.Request {
  let mut request = @http.Request::post("/v1/messages").json_body(Json(body))
  match anthropic_version {
    Some(value) =>
      request = request.header("anthropic-version", parameter_value(value))
    None => ()
  }
  match anthropic_user_profile_id {
    Some(value) =>
      request = request.header(
        "anthropic-user-profile-id",
        parameter_value(value),
      )
    None => ()
  }
  match anthropic_workspace_id {
    Some(value) =>
      request = request.header("anthropic-workspace-id", parameter_value(value))
    None => ()
  }
  request
}

///|
///
/// Decodes a parsed successful messages_post response.
pub fn messages_post_decode_json(
  value : Json,
) -> Message raise @json.JsonDecodeError {
  @json.from_json(value)
}

///|
///
/// Decodes a successful messages_post response.
pub fn messages_post_decode(
  response : @http.Response,
) -> Message raise @runtime.SdkError {
  decode_response(response)
}

///|
///
/// List Models
pub fn models_list_request(
  before_id? : String,
  after_id? : String,
  limit? : Int32,
  lifecycle? : Array[ModelsListLifecycleItem],
  anthropic_version? : String,
  anthropic_beta? : Array[String],
  x_api_key? : String,
  anthropic_workspace_id? : String,
) -> @http.Request {
  let mut url = "/v1/models"
  match before_id {
    Some(value) =>
      url = @http.append_query(url, "before_id", parameter_value(value))
    None => ()
  }
  match after_id {
    Some(value) =>
      url = @http.append_query(url, "after_id", parameter_value(value))
    None => ()
  }
  match limit {
    Some(value) =>
      url = @http.append_query(url, "limit", parameter_value(value))
    None => ()
  }
  match lifecycle {
    Some(values) =>
      for value in values {
        url = @http.append_query(url, "lifecycle[]", parameter_value(value))
      }
    None => ()
  }
  let mut request = @http.Request::get(url)
  match anthropic_version {
    Some(value) =>
      request = request.header("anthropic-version", parameter_value(value))
    None => ()
  }
  match anthropic_beta {
    Some(values) =>
      request = request.header(
        "anthropic-beta",
        values.map(value => parameter_value(value)).join(","),
      )
    None => ()
  }
  match x_api_key {
    Some(value) => request = request.header("x-api-key", parameter_value(value))
    None => ()
  }
  match anthropic_workspace_id {
    Some(value) =>
      request = request.header("anthropic-workspace-id", parameter_value(value))
    None => ()
  }
  request
}

///|
///
/// Decodes a parsed successful models_list response.
pub fn models_list_decode_json(
  value : Json,
) -> ListResponseModelInfo raise @json.JsonDecodeError {
  @json.from_json(value)
}

///|
///
/// Decodes a successful models_list response.
pub fn models_list_decode(
  response : @http.Response,
) -> ListResponseModelInfo raise @runtime.SdkError {
  decode_response(response)
}

///|
///
/// Get a Model
pub fn models_get_request(
  model_id : String,
  anthropic_version? : String,
  anthropic_beta? : Array[String],
  x_api_key? : String,
  anthropic_workspace_id? : String,
) -> @http.Request {
  let mut request = @http.Request::get(
    "/v1/models/" + @http.percent_encode(parameter_value(model_id)),
  )
  match anthropic_version {
    Some(value) =>
      request = request.header("anthropic-version", parameter_value(value))
    None => ()
  }
  match anthropic_beta {
    Some(values) =>
      request = request.header(
        "anthropic-beta",
        values.map(value => parameter_value(value)).join(","),
      )
    None => ()
  }
  match x_api_key {
    Some(value) => request = request.header("x-api-key", parameter_value(value))
    None => ()
  }
  match anthropic_workspace_id {
    Some(value) =>
      request = request.header("anthropic-workspace-id", parameter_value(value))
    None => ()
  }
  request
}

///|
///
/// Decodes a parsed successful models_get response.
pub fn models_get_decode_json(
  value : Json,
) -> ModelInfo raise @json.JsonDecodeError {
  @json.from_json(value)
}

///|
///
/// Decodes a successful models_get response.
pub fn models_get_decode(
  response : @http.Response,
) -> ModelInfo raise @runtime.SdkError {
  decode_response(response)
}

///|
///
/// Count tokens in a Message
pub fn messages_count_tokens_post_request(
  body : CountMessageTokensParams,
  anthropic_version? : String,
  anthropic_user_profile_id? : String,
  anthropic_workspace_id? : String,
) -> @http.Request {
  let mut request = @http.Request::post("/v1/messages/count_tokens").json_body(
    Json(body),
  )
  match anthropic_version {
    Some(value) =>
      request = request.header("anthropic-version", parameter_value(value))
    None => ()
  }
  match anthropic_user_profile_id {
    Some(value) =>
      request = request.header(
        "anthropic-user-profile-id",
        parameter_value(value),
      )
    None => ()
  }
  match anthropic_workspace_id {
    Some(value) =>
      request = request.header("anthropic-workspace-id", parameter_value(value))
    None => ()
  }
  request
}

///|
///
/// Decodes a parsed successful messages_count_tokens_post response.
pub fn messages_count_tokens_post_decode_json(
  value : Json,
) -> CountMessageTokensResponse raise @json.JsonDecodeError {
  @json.from_json(value)
}

///|
///
/// Decodes a successful messages_count_tokens_post response.
pub fn messages_count_tokens_post_decode(
  response : @http.Response,
) -> CountMessageTokensResponse raise @runtime.SdkError {
  decode_response(response)
}