use std::collections::BTreeMap;
use phoxal::api;
use phoxal::prelude::*;
#[derive(serde::Deserialize, phoxal::Config)]
struct Config {}
#[derive(phoxal::Api)]
struct Api {
get: Server<api::asset::GetRequest, api::asset::GetResponse>,
}
#[phoxal::service(id = "asset-store")]
struct AssetStore {
assets: BTreeMap<String, Vec<u8>>,
}
#[phoxal::behavior]
impl AssetStore {
#[setup]
async fn setup(ctx: &mut SetupContext<Self>) -> Result<(Self, Self::Api)> {
let mut assets = BTreeMap::new();
assets.insert("map.pgm".to_string(), vec![0x50, 0x35, 0x0a]);
Ok((
Self { assets },
Self::Api {
get: ctx.server(api::topic::client().asset().get()).await?,
},
))
}
#[server(api = get)]
async fn get(
&mut self,
_api: &mut Self::Api,
request: api::asset::GetRequest,
) -> ServerResult<api::asset::GetResponse> {
match self.assets.get(&request.path) {
Some(bytes) => Ok(api::asset::GetResponse::Found {
bytes: bytes.clone(),
}),
None => Ok(api::asset::GetResponse::Missing),
}
}
}
fn main() -> phoxal::Result<()> {
phoxal::run::<AssetStore>()
}