Files
start-os/backend/src/properties.rs
Aiden McClelland 202695096a Feature/simple syncdb (#2464)
* simplify db sync on rpc endpoints

* switch to patch-db master

* update fe for websocket only stream

* fix api

---------

Co-authored-by: Matt Hill <mattnine@protonmail.com>
2023-10-17 15:49:58 +00:00

51 lines
1.4 KiB
Rust

use clap::ArgMatches;
use color_eyre::eyre::eyre;
use rpc_toolkit::command;
use serde_json::Value;
use tracing::instrument;
use crate::context::RpcContext;
use crate::prelude::*;
use crate::procedure::ProcedureName;
use crate::s9pk::manifest::PackageId;
use crate::{Error, ErrorKind};
pub fn display_properties(response: Value, _: &ArgMatches) {
println!("{}", response);
}
#[command(display(display_properties))]
pub async fn properties(#[context] ctx: RpcContext, #[arg] id: PackageId) -> Result<Value, Error> {
Ok(fetch_properties(ctx, id).await?)
}
#[instrument(skip_all)]
pub async fn fetch_properties(ctx: RpcContext, id: PackageId) -> Result<Value, Error> {
let peek = ctx.db.peek().await;
let manifest = peek
.as_package_data()
.as_idx(&id)
.ok_or_else(|| Error::new(eyre!("{} is not installed", id), ErrorKind::NotFound))?
.expect_as_installed()?
.as_manifest()
.de()?;
if let Some(props) = manifest.properties {
props
.execute::<(), Value>(
&ctx,
&manifest.id,
&manifest.version,
ProcedureName::Properties,
&manifest.volumes,
None,
None,
)
.await?
.map_err(|(_, e)| Error::new(eyre!("{}", e), ErrorKind::Docker))
.and_then(|a| Ok(a))
} else {
Ok(Value::Null)
}
}