use std::io::{Read, Write};
use brazen::native::{
HttpTransport, LoopbackReceiver, RealPacer, SystemBrowserLauncher, SystemClock, TcpBind,
random_token, stash_root,
};
use super::store::{WallCredStore, WallModelCache};
use crate::config_edit::brazen::BrazenPaths;
use crate::xdg::Env;
pub(super) struct Seams {
transport: HttpTransport,
store: WallCredStore,
cache: WallModelCache,
clock: SystemClock,
}
impl Seams {
pub(super) fn wire(paths: &BrazenPaths, env: &Env) -> Self {
Self {
transport: HttpTransport::new(),
store: WallCredStore::new(paths.credentials_dir.clone(), env.clone()),
cache: WallModelCache::new(paths.models_cache_dir.clone()),
clock: SystemClock,
}
}
}
pub(super) fn data_plane(
args: brazen::Args,
seams: &Seams,
stdin: &mut dyn Read,
stdout: &mut dyn Write,
stderr: &mut dyn Write,
) -> u8 {
let stash = brazen::ReplayStash::new(stash_root());
let host = brazen::Host {
transport: &seams.transport,
store: &seams.store,
cache: &seams.cache,
clock: &seams.clock,
stash: &stash,
};
brazen::run(args, stdin, stdout, stderr, &host)
}
pub(super) fn list_models(
args: &brazen::Args,
seams: &Seams,
stdout: &mut dyn Write,
stderr: &mut dyn Write,
) -> u8 {
let mut io = brazen::ListIo {
stdout,
stderr,
transport: &seams.transport,
store: &seams.store,
cache: &seams.cache,
clock: &seams.clock,
};
brazen::list_models(args, &mut io)
}
pub(super) fn list_providers(
args: &brazen::Args,
seams: &Seams,
stdout: &mut dyn Write,
stderr: &mut dyn Write,
) -> u8 {
let mut io = brazen::ProvidersIo {
stdout,
stderr,
store: &seams.store,
};
brazen::list_providers(args, &mut io)
}
pub(super) fn count_tokens(
args: &brazen::Args,
seams: &Seams,
stdin: &mut dyn Read,
stdout: &mut dyn Write,
stderr: &mut dyn Write,
) -> u8 {
let mut io = brazen::CountIo {
stdout,
stderr,
transport: &seams.transport,
store: &seams.store,
cache: &seams.cache,
clock: &seams.clock,
};
brazen::count_tokens(args, stdin, &mut io)
}
pub(super) fn serve(
args: &brazen::Args,
seams: &Seams,
stdout: &mut dyn Write,
stderr: &mut dyn Write,
) -> u8 {
let (bind, stash) = (TcpBind, brazen::ReplayStash::new(stash_root()));
let mut io = brazen::ServeIo {
stdout,
stderr,
bind: &bind,
transport: &seams.transport,
store: &seams.store,
cache: &seams.cache,
clock: &seams.clock,
stash: &stash,
};
brazen::serve(args, &mut io)
}
pub(super) fn login(
args: &brazen::Args,
seams: &Seams,
stdout: &mut dyn Write,
stderr: &mut dyn Write,
) -> u8 {
let (browser, pacer, receiver) = (SystemBrowserLauncher, RealPacer, LoopbackReceiver::new());
let (verifier, state) = (random_token(), random_token());
let mut io = brazen::LoginIo {
stdout,
stderr,
transport: &seams.transport,
store: &seams.store,
clock: &seams.clock,
browser: &browser,
receiver: &receiver,
pacer: &pacer,
verifier: &verifier,
state: &state,
};
brazen::login(args, &mut io)
}