1#![cfg(feature = "client")]
18
19use std::any::Any;
20
21use anyhow::{Result, anyhow};
22use async_trait::async_trait;
23use weft_client_shim::{CliContext, WeftExtensions};
24
25use crate::cli::{AuthCommands, commands::cmd_auth};
26
27pub struct EnabledWeftExtensions;
28
29#[async_trait]
30impl WeftExtensions for EnabledWeftExtensions {
31 async fn auth(
32 &self,
33 ctx: &(dyn CliContext + 'static),
34 command: &(dyn Any + Send + Sync),
35 ) -> Result<()> {
36 let command = downcast::<AuthCommands>(command, "AuthCommands")?;
37 cmd_auth(ctx, command.clone().into()).await
38 }
39
40 async fn whoami(
41 &self,
42 ctx: &(dyn CliContext + 'static),
43 server: Option<String>,
44 ) -> Result<()> {
45 heddle_client::cmd_whoami(ctx, server).await
46 }
47}
48
49fn downcast<'a, T: 'static>(
50 value: &'a (dyn Any + Send + Sync),
51 name: &'static str,
52) -> Result<&'a T> {
53 value
54 .downcast_ref::<T>()
55 .ok_or_else(|| anyhow!("WeftExtensions trait dispatch: failed to downcast to {name}"))
56}