langfuse_rs/apis/
mod.rs

1use std::error;
2use std::fmt;
3
4#[derive(Debug, Clone)]
5pub struct ResponseContent<T> {
6	pub status: reqwest::StatusCode,
7	pub content: String,
8	pub entity: Option<T>,
9}
10
11#[derive(Debug)]
12pub enum Error<T> {
13	Reqwest(reqwest::Error),
14	Serde(serde_json::Error),
15	Io(std::io::Error),
16	ResponseError(ResponseContent<T>),
17}
18
19impl<T> fmt::Display for Error<T> {
20	fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
21		let (module, e) = match self {
22			Error::Reqwest(e) => ("reqwest", e.to_string()),
23			Error::Serde(e) => ("serde", e.to_string()),
24			Error::Io(e) => ("IO", e.to_string()),
25			Error::ResponseError(e) => ("response", format!("status code {}", e.status)),
26		};
27		write!(f, "error in {}: {}", module, e)
28	}
29}
30
31impl<T: fmt::Debug> error::Error for Error<T> {
32	fn source(&self) -> Option<&(dyn error::Error + 'static)> {
33		Some(match self {
34			Error::Reqwest(e) => e,
35			Error::Serde(e) => e,
36			Error::Io(e) => e,
37			Error::ResponseError(_) => return None,
38		})
39	}
40}
41
42impl<T> From<reqwest::Error> for Error<T> {
43	fn from(e: reqwest::Error) -> Self {
44		Error::Reqwest(e)
45	}
46}
47
48impl<T> From<serde_json::Error> for Error<T> {
49	fn from(e: serde_json::Error) -> Self {
50		Error::Serde(e)
51	}
52}
53
54impl<T> From<std::io::Error> for Error<T> {
55	fn from(e: std::io::Error) -> Self {
56		Error::Io(e)
57	}
58}
59
60pub fn urlencode<T: AsRef<str>>(s: T) -> String {
61	::url::form_urlencoded::byte_serialize(s.as_ref().as_bytes()).collect()
62}
63
64pub fn parse_deep_object(prefix: &str, value: &serde_json::Value) -> Vec<(String, String)> {
65	if let serde_json::Value::Object(object) = value {
66		let mut params = vec![];
67
68		for (key, value) in object {
69			match value {
70				serde_json::Value::Object(_) => params.append(&mut parse_deep_object(&format!("{}[{}]", prefix, key), value)),
71				serde_json::Value::Array(array) => {
72					for (i, value) in array.iter().enumerate() {
73						params.append(&mut parse_deep_object(&format!("{}[{}][{}]", prefix, key, i), value));
74					}
75				}
76				serde_json::Value::String(s) => params.push((format!("{}[{}]", prefix, key), s.clone())),
77				_ => params.push((format!("{}[{}]", prefix, key), value.to_string())),
78			}
79		}
80
81		return params;
82	}
83
84	unimplemented!("Only objects are supported with style=deepObject")
85}
86
87pub mod comments_api;
88pub mod dataset_items_api;
89pub mod dataset_run_items_api;
90pub mod datasets_api;
91pub mod health_api;
92pub mod ingestion_api;
93pub mod media_api;
94pub mod metrics_api;
95pub mod models_api;
96pub mod observations_api;
97pub mod projects_api;
98pub mod prompt_version_api;
99pub mod prompts_api;
100pub mod score_api;
101pub mod score_configs_api;
102pub mod sessions_api;
103pub mod trace_api;
104
105pub mod configuration;