use canton_auth::{OidcConfig, TokenProvider};
use canton_ledger::{CantonClient, Config, Error, Submit, create, identifier, record, value};
fn env(name: &str) -> canton_ledger::Result<String> {
let plain = format!("CANTON_{name}");
let test = format!("CANTON_TEST_{name}");
std::env::var(&plain)
.or_else(|_| std::env::var(&test))
.map_err(|_| Error::InvalidRequest(format!("set {plain} (or {test})")))
}
#[tokio::main]
async fn main() -> canton_ledger::Result<()> {
let oidc = OidcConfig::new(env("TOKEN_URL")?, env("CLIENT_ID")?, env("CLIENT_SECRET")?);
let party = env("PARTY")?;
let pkg = env("LICENSING_PKG")?;
let client = CantonClient::connect_lazy(
Config::new(env("ENDPOINT")?).with_oidc(TokenProvider::new(oidc)),
)?;
let arguments = record(vec![
("provider", value::party(&party)),
("user", value::party(&party)),
(
"meta",
value::record(record(vec![("values", value::empty_text_map())])),
),
]);
let command = create(
identifier(&pkg, "Licensing.AppInstall", "AppInstallRequest"),
arguments,
);
let transaction = client
.submit_and_wait_for_transaction(Submit::new(&party).add_command(command))
.await?;
println!(
"committed transaction {} at offset {} with {} event(s)",
transaction.update_id,
transaction.offset,
transaction.events.len()
);
Ok(())
}