use async_trait::async_trait;
use reqwest::Method;
use serde::{Deserialize, Serialize};
use smbcloud_ascapi_core::Client;
use smbcloud_ascapi_core::Result;
pub const RESOURCE_TYPE: &str = "appPriceSchedules";
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct AppPriceSchedule {
pub id: String,
pub base_territory: Option<String>,
}
#[derive(Debug, Clone, Deserialize)]
struct ScheduleDocument {
data: ScheduleResource,
}
#[derive(Debug, Clone, Deserialize)]
struct ScheduleResource {
id: String,
#[serde(default)]
relationships: ScheduleRelationships,
}
#[derive(Debug, Clone, Default, Deserialize)]
#[serde(rename_all = "camelCase")]
struct ScheduleRelationships {
#[serde(default)]
base_territory: Option<crate::app_price::ToOne>,
}
#[async_trait]
pub trait AppPriceSchedulesApi {
async fn get_app_price_schedule(&self, app_id: &str) -> Result<AppPriceSchedule>;
}
#[async_trait]
impl AppPriceSchedulesApi for Client {
async fn get_app_price_schedule(&self, app_id: &str) -> Result<AppPriceSchedule> {
let path = format!("/v1/appPriceSchedules/{app_id}");
let doc: ScheduleDocument = self
.request(
Method::GET,
&path,
&[("include", "baseTerritory")],
None::<&()>,
)
.await?;
Ok(AppPriceSchedule {
id: doc.data.id,
base_territory: doc
.data
.relationships
.base_territory
.and_then(|rel| rel.data)
.map(|reference| reference.id),
})
}
}