Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 9 additions & 9 deletions rust/cli/src/commands/browse.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,11 @@ use crate::client::admin_client::AdminClient;
use crate::client::chroma_client::ChromaClient;
use crate::commands::db::get_db_name;
use crate::commands::install::InstallError;
use crate::config_store::{self, ConfigStore, FileConfigStore};
use crate::terminal::{SystemTerminal, Terminal};
use crate::tui::collection_browser::CollectionBrowser;
use crate::ui_utils::Theme;
use crate::utils::{
get_current_profile, parse_host, parse_local, parse_path, read_config, write_config,
AddressBook, CliError, LocalChromaArgs,
};
use crate::utils::{parse_host, parse_local, parse_path, AddressBook, CliError, LocalChromaArgs};
use clap::Parser;
use crossterm::style::Stylize;
use thiserror::Error;
Expand Down Expand Up @@ -77,10 +75,11 @@ async fn parse_local_args(
pub async fn get_cloud_client(
db_name: Option<String>,
collection_name: &str,
store: &dyn ConfigStore,
term: &mut dyn Terminal,
) -> Result<ChromaClient, CliError> {
let profile = get_current_profile()?;
let admin_client = AdminClient::from_profile(AddressBook::cloud().frontend_url, &profile.1);
let (_, profile) = config_store::get_current_profile(store)?;
let admin_client = AdminClient::from_profile(AddressBook::cloud().frontend_url, &profile);

if let Some(db_name) = db_name {
let _verified = admin_client.get_database(db_name.clone()).await?;
Expand Down Expand Up @@ -108,13 +107,14 @@ fn local_setup(args: BrowseArgs) -> bool {
}

pub fn browse(args: BrowseArgs) -> Result<(), CliError> {
let store = FileConfigStore;
let mut term = SystemTerminal;
let runtime = tokio::runtime::Runtime::new().map_err(|_| InstallError::RuntimeError)?;
runtime.block_on(async {
let (client, _handle) = match local_setup(args.clone()) {
true => parse_local_args(args.clone()).await,
false => Ok((
get_cloud_client(args.db_name, &args.collection_name, &mut term).await?,
get_cloud_client(args.db_name, &args.collection_name, &store, &mut term).await?,
None,
)),
}?;
Expand All @@ -124,12 +124,12 @@ pub fn browse(args: BrowseArgs) -> Result<(), CliError> {
.await
.map_err(|_| BrowseError::CollectionNotFound(args.collection_name))?;

let mut config = read_config()?;
let mut config = store.read_config()?;

if let Some(theme) = args.theme {
if config.theme != theme {
config.theme = theme;
write_config(&config)?;
store.write_config(&config)?;
}
}

Expand Down
8 changes: 5 additions & 3 deletions rust/cli/src/commands/copy.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,11 @@ use crate::client::collection::CollectionAPIError;
use crate::commands::browse::BrowseError;
use crate::commands::db::get_db_name;
use crate::commands::install::InstallError;
use crate::config_store::{self, FileConfigStore};
use crate::terminal::{SystemTerminal, Terminal};
use crate::utils::{
get_current_profile, parse_host, parse_local, parse_path, AddressBook, CliError, Environment,
ErrorResponse, Profile, UtilsError,
parse_host, parse_local, parse_path, AddressBook, CliError, Environment, ErrorResponse,
Profile, UtilsError,
};
use chroma_types::{CollectionConfiguration, IncludeList};
use clap::Parser;
Expand Down Expand Up @@ -335,7 +336,8 @@ pub fn copy(args: CopyArgs) -> Result<(), CliError> {
return Err(CopyError::NoCollections.into());
}

let (_, profile) = get_current_profile()?;
let store = FileConfigStore;
let (_, profile) = config_store::get_current_profile(&store)?;
let (source, target) = get_target_and_destination(&args, &mut term)?;
let (source_client, target_client, _handle) =
get_chroma_clients(&args, source, target, profile, &mut term).await?;
Expand Down
8 changes: 5 additions & 3 deletions rust/cli/src/commands/db.rs
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
use crate::client::admin_client::get_admin_client;
use crate::config_store::{self, FileConfigStore};
use crate::terminal::{SystemTerminal, Terminal};
use crate::ui_utils::copy_to_clipboard;
use crate::utils::{
get_current_profile, CliError, Profile, CHROMA_API_KEY_ENV_VAR, CHROMA_DATABASE_ENV_VAR,
CHROMA_TENANT_ENV_VAR, SELECTION_LIMIT,
CliError, Profile, CHROMA_API_KEY_ENV_VAR, CHROMA_DATABASE_ENV_VAR, CHROMA_TENANT_ENV_VAR,
SELECTION_LIMIT,
};
use chroma_types::Database;
use clap::{Args, Subcommand, ValueEnum};
Expand Down Expand Up @@ -488,7 +489,8 @@ pub async fn list(
}

pub fn db_command(command: DbCommand) -> Result<(), CliError> {
let (profile_name, current_profile) = get_current_profile()?;
let store = FileConfigStore;
let (profile_name, current_profile) = config_store::get_current_profile(&store)?;
let mut term = SystemTerminal;

let runtime = tokio::runtime::Runtime::new().map_err(|_| DbError::RuntimeError)?;
Expand Down
23 changes: 14 additions & 9 deletions rust/cli/src/commands/install.rs
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
use crate::config_store::{self, ConfigStore, FileConfigStore};
use crate::terminal::{SystemTerminal, Terminal};
use crate::ui_utils::read_secret;
use crate::utils::UtilsError::UserInputFailed;
use crate::utils::{
get_current_profile, read_config, write_config, CliConfig, CliError, Profile, SELECTION_LIMIT,
};
use crate::utils::{CliConfig, CliError, Profile, SELECTION_LIMIT};
use clap::Parser;
use colored::Colorize;
use indicatif::{ProgressBar, ProgressStyle};
Expand Down Expand Up @@ -470,11 +469,12 @@ fn get_app_env_variables(
app_config: &SampleAppConfig,
local: bool,
db_name: Option<String>,
store: &dyn ConfigStore,
term: &mut dyn Terminal,
) -> Result<SampleAppEnvVariables, CliError> {
let mut env_variables = match local {
false => {
let (_, current_profile) = get_current_profile()?;
let (_, current_profile) = config_store::get_current_profile(store)?;
SampleAppEnvVariables::cloud(
current_profile,
db_name.ok_or(InstallError::DatabaseRequired)?,
Expand Down Expand Up @@ -534,8 +534,12 @@ fn display_run_instructions(app_config: SampleAppConfig, term: &mut dyn Terminal
));
}

async fn install_sample_app(args: InstallArgs, term: &mut dyn Terminal) -> Result<(), CliError> {
let mut cli_config = read_config()?;
async fn install_sample_app(
args: InstallArgs,
store: &dyn ConfigStore,
term: &mut dyn Terminal,
) -> Result<(), CliError> {
let mut cli_config = store.read_config()?;
let apps = download_github_file::<Vec<AppListing>>("sample_apps/listings.json")
.await
.map_err(|_| InstallError::ListingsDownloadFailed)?;
Expand All @@ -559,7 +563,7 @@ async fn install_sample_app(args: InstallArgs, term: &mut dyn Terminal) -> Resul
if !args.local && args.db.is_none() {
return Err(InstallError::DatabaseRequired.into());
}
let env_variables = get_app_env_variables(&app_config, args.local, args.db, term)?;
let env_variables = get_app_env_variables(&app_config, args.local, args.db, store, term)?;
write_env_file(env_variables, format!("./{}/.env", app_name))
.map_err(|_| InstallError::EnvFileWriteFailed)?;

Expand All @@ -568,7 +572,7 @@ async fn install_sample_app(args: InstallArgs, term: &mut dyn Terminal) -> Resul
.sample_apps
.installed
.insert(app_name, app_version);
write_config(&cli_config)?;
store.write_config(&cli_config)?;

// Output run instructions
display_run_instructions(app_config, term);
Expand All @@ -577,8 +581,9 @@ async fn install_sample_app(args: InstallArgs, term: &mut dyn Terminal) -> Resul
}

pub fn install(args: InstallArgs) -> Result<(), CliError> {
let store = FileConfigStore;
let mut term = SystemTerminal;
let runtime = tokio::runtime::Runtime::new().map_err(|_| InstallError::RuntimeError)?;
runtime.block_on(async { install_sample_app(args, &mut term).await })?;
runtime.block_on(async { install_sample_app(args, &store, &mut term).await })?;
Ok(())
}
39 changes: 23 additions & 16 deletions rust/cli/src/commands/login.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,10 @@ use crate::client::dashboard_client::{
};
use crate::commands::db::DbError;
use crate::commands::login::LoginError::BrowserAuthFailed;
use crate::config_store::{ConfigStore, FileConfigStore};
use crate::terminal::{SystemTerminal, Terminal};
use crate::ui_utils::validate_uri;
use crate::utils::{
read_config, read_profiles, write_config, write_profiles, CliError, Profile, Profiles,
UtilsError, CHROMA_DIR, CREDENTIALS_FILE,
};
use crate::utils::{CliError, Profile, Profiles, UtilsError, CHROMA_DIR, CREDENTIALS_FILE};
use clap::Parser;
use colored::Colorize;
use std::error::Error;
Expand Down Expand Up @@ -182,7 +180,11 @@ async fn browser_auth(
}
}

pub async fn browser_login(args: LoginArgs, term: &mut dyn Terminal) -> Result<(), CliError> {
pub async fn browser_login(
args: LoginArgs,
store: &dyn ConfigStore,
term: &mut dyn Terminal,
) -> Result<(), CliError> {
let dashboard_client = get_dashboard_client(args.dev);

let session_id = browser_auth(&dashboard_client, term)
Expand Down Expand Up @@ -210,7 +212,7 @@ pub async fn browser_login(args: LoginArgs, term: &mut dyn Terminal) -> Result<(
}
};

let mut profiles = read_profiles()?;
let mut profiles = store.read_profiles()?;
let mut profile_name = match args.profile {
Some(name) => name,
None => get_profile_from_team(&team, &profiles, term)?,
Expand All @@ -220,13 +222,13 @@ pub async fn browser_login(args: LoginArgs, term: &mut dyn Terminal) -> Result<(

let set_current = profiles.is_empty();
profiles.insert(profile_name.clone(), profile);
write_profiles(&profiles)?;
store.write_profiles(&profiles)?;

let mut config = read_config()?;
let mut config = store.read_config()?;

if set_current {
config.current_profile = profile_name.clone();
write_config(&config)?;
store.write_config(&config)?;
}

term.println(&login_success_message(&team.name, &profile_name));
Expand All @@ -240,13 +242,17 @@ pub async fn browser_login(args: LoginArgs, term: &mut dyn Terminal) -> Result<(
Ok(())
}

pub async fn headless_login(args: LoginArgs, term: &mut dyn Terminal) -> Result<(), CliError> {
pub async fn headless_login(
args: LoginArgs,
store: &dyn ConfigStore,
term: &mut dyn Terminal,
) -> Result<(), CliError> {
let api_key = args.api_key.unwrap_or_default();

let mut profile_name = args.profile.unwrap_or_default();
profile_name = validate_profile_name(profile_name)?;

let mut profiles = read_profiles()?;
let mut profiles = store.read_profiles()?;

if profiles.contains_key(&profile_name) {
return Err(LoginError::ProfileAlreadyExists(profile_name).into());
Expand All @@ -263,13 +269,13 @@ pub async fn headless_login(args: LoginArgs, term: &mut dyn Terminal) -> Result<

let set_current = profiles.is_empty();
profiles.insert(profile_name.clone(), profile);
write_profiles(&profiles)?;
store.write_profiles(&profiles)?;

let mut config = read_config()?;
let mut config = store.read_config()?;

if set_current {
config.current_profile = profile_name.clone();
write_config(&config)?;
store.write_config(&config)?;
}

if !config.current_profile.eq(&profile_name) {
Expand All @@ -282,12 +288,13 @@ pub async fn headless_login(args: LoginArgs, term: &mut dyn Terminal) -> Result<
}

pub fn login(args: LoginArgs) -> Result<(), CliError> {
let store = FileConfigStore;
let mut term = SystemTerminal;
let runtime = tokio::runtime::Runtime::new().map_err(|_| DbError::RuntimeError)?;
runtime.block_on(async {
match (&args.api_key, &args.profile) {
(Some(_), Some(_)) => headless_login(args, &mut term).await,
_ => browser_login(args, &mut term).await,
(Some(_), Some(_)) => headless_login(args, &store, &mut term).await,
_ => browser_login(args, &store, &mut term).await,
}
})?;
Ok(())
Expand Down
Loading
Loading