lago_client/queries/
billable_metric.rs

1use lago_types::{
2    error::{LagoError, Result},
3    requests::billable_metric::{
4        CreateBillableMetricRequest, GetBillableMetricRequest, ListBillableMetricsRequest,
5    },
6    responses::billable_metric::{
7        CreateBillableMetricResponse, GetBillableMetricResponse, ListBillableMetricsResponse,
8    },
9};
10use url::Url;
11
12use crate::client::LagoClient;
13
14impl LagoClient {
15    /// Retrieves a list of billable metrics with optional filtering parameters
16    ///
17    /// # Arguments
18    /// * `request` - Optional filtering parameters for the billable metric list
19    ///
20    /// # Returns
21    /// A `Result` containing the list of billable metrics or an error
22    pub async fn list_billable_metrics(
23        &self,
24        request: Option<ListBillableMetricsRequest>,
25    ) -> Result<ListBillableMetricsResponse> {
26        let request = request.unwrap_or_default();
27        let region = self.config.region()?;
28        let mut url = Url::parse(&format!("{}/billable_metrics", region.endpoint()))
29            .map_err(|e| LagoError::Configuration(format!("Invalid URL: {e}")))?;
30
31        let query_params = request.to_query_params();
32
33        if !query_params.is_empty() {
34            let query_string = query_params
35                .iter()
36                .map(|(k, v)| format!("{k}={v}"))
37                .collect::<Vec<_>>()
38                .join("&");
39            url.set_query(Some(&query_string));
40        }
41
42        self.make_request("GET", url.as_str(), None::<&()>).await
43    }
44
45    /// Retrieves a specific billable metric by its code
46    ///
47    /// # Arguments
48    /// * `request` - The request containing the billable metric code to retrieve
49    ///
50    /// # Returns
51    /// A `Result` containing the billable metric data or an error
52    pub async fn get_billable_metric(
53        &self,
54        request: GetBillableMetricRequest,
55    ) -> Result<GetBillableMetricResponse> {
56        let region = self.config.region()?;
57        let url = format!("{}/billable_metrics/{}", region.endpoint(), request.code);
58
59        self.make_request("GET", &url, None::<&()>).await
60    }
61
62    /// Creates a new billable metric
63    ///
64    /// # Arguments
65    /// * `request` - The request containing the billable metric data to create
66    ///
67    /// # Returns
68    /// A `Result` containing the created billable metric data or an error
69    pub async fn create_billable_metric(
70        &self,
71        request: CreateBillableMetricRequest,
72    ) -> Result<CreateBillableMetricResponse> {
73        let region = self.config.region()?;
74        let url = format!("{}/billable_metrics", region.endpoint());
75
76        self.make_request("POST", &url, Some(&request)).await
77    }
78}