vyctor 0.1.0

A fast CLI tool for semantic file search using vector embeddings
Documentation
//! Implementation of the `vyctor config` command

use crate::config::{config_path, find_vyctor_root, load_config};
use anyhow::Result;
use colored::Colorize;
use std::process::Command;

/// Run the config command
pub async fn run(edit: bool) -> Result<()> {
    let _root = find_vyctor_root()?;
    let path = config_path()?;

    if edit {
        // Open config in editor
        let editor = std::env::var("EDITOR").unwrap_or_else(|_| {
            if cfg!(target_os = "macos") {
                "open".to_string()
            } else if cfg!(target_os = "windows") {
                "notepad".to_string()
            } else {
                "nano".to_string()
            }
        });

        println!("{} Opening config in {}", "".cyan(), editor);
        Command::new(&editor).arg(&path).status()?;
    } else {
        // Show current config
        let config = load_config()?;

        println!("{}", "Current Configuration:".bold());
        println!();
        println!("{}", "[indexing]".cyan());
        println!("include = [");
        for pattern in &config.indexing.include {
            println!("    \"{}\",", pattern);
        }
        println!("]");
        println!("exclude = [");
        for pattern in &config.indexing.exclude {
            println!("    \"{}\",", pattern);
        }
        println!("]");
        println!("chunk_size = {}", config.indexing.chunk_size);
        println!("chunk_overlap = {}", config.indexing.chunk_overlap);
        println!();
        println!("{}", "[embedding]".cyan());
        println!("provider = \"{:?}\"", config.embedding.provider);
        println!("dimensions = {}", config.embedding.dimensions);
        println!("batch_size = {}", config.embedding.batch_size);
        println!();

        // Show the active provider's config
        match config.embedding.provider {
            crate::config::EmbeddingProvider::OpenAI => {
                println!("{}", "[embedding.openai]".cyan());
                println!("model = \"{}\"", config.embedding.openai.model);
                println!("api_key_env = \"{}\"", config.embedding.openai.api_key_env);
                println!("base_url = \"{}\"", config.embedding.openai.base_url);
            }
            crate::config::EmbeddingProvider::Voyage => {
                println!("{}", "[embedding.voyage]".cyan());
                println!("model = \"{}\"", config.embedding.voyage.model);
                println!("api_key_env = \"{}\"", config.embedding.voyage.api_key_env);
                println!("base_url = \"{}\"", config.embedding.voyage.base_url);
            }
            crate::config::EmbeddingProvider::Local => {
                println!("{}", "[embedding.local]".cyan());
                println!("model = \"{}\"", config.embedding.local.model);
                println!("cache_dir = \"{}\"", config.embedding.local.cache_dir);
            }
        }
        println!();

        println!("{}", "".repeat(50).dimmed());
        println!("Config file: {}", path.display().to_string().dimmed());
        println!("Run '{}' to edit", "vyctor config --edit".cyan());
    }

    Ok(())
}