use base64::Engine;
use base64::engine::general_purpose::URL_SAFE;
use reqwest::Method;
use serde::Deserialize;
use crate::client::request;
use crate::swarm::Error;
use super::DebugApi;
pub const LOG_LEVELS: &[&str] = &["none", "error", "warning", "info", "debug", "all"];
#[derive(Clone, Debug, PartialEq, Eq, Deserialize)]
pub struct Logger {
pub logger: String,
pub verbosity: String,
pub subsystem: String,
pub id: String,
}
#[derive(Clone, Debug, PartialEq, Eq, Deserialize)]
pub struct LoggerListing {
#[serde(default)]
pub tree: serde_json::Value,
#[serde(default)]
pub loggers: Vec<Logger>,
}
impl DebugApi {
pub async fn loggers(&self) -> Result<LoggerListing, Error> {
let builder = request(&self.inner, Method::GET, "loggers")?;
self.inner.send_json(builder).await
}
pub async fn loggers_by_expression(&self, expression: &str) -> Result<LoggerListing, Error> {
let enc = URL_SAFE.encode(expression.as_bytes());
let path = format!("loggers/{enc}");
let builder = request(&self.inner, Method::GET, &path)?;
self.inner.send_json(builder).await
}
pub async fn set_logger(&self, expression: &str, verbosity: &str) -> Result<(), Error> {
if !LOG_LEVELS.contains(&verbosity) {
return Err(Error::argument(format!(
"verbosity {verbosity:?} not in {LOG_LEVELS:?}"
)));
}
let enc = URL_SAFE.encode(expression.as_bytes());
let path = format!("loggers/{enc}/{verbosity}");
let builder = request(&self.inner, Method::PUT, &path)?;
self.inner.send(builder).await?;
Ok(())
}
#[deprecated(
since = "1.6.0",
note = "broken — emits the wrong path. Use `set_logger(expr, verbosity)` instead."
)]
pub async fn set_logger_verbosity(&self, _expression: &str) -> Result<(), Error> {
Err(Error::argument(
"set_logger_verbosity is broken — Bee's route requires a verbosity component. \
Call set_logger(expression, verbosity) instead.",
))
}
}