use dumpfs::tk;
use std::str::FromStr;
#[napi(object)]
pub struct ScanOpts {
pub no_gitignore: Option<bool>,
pub no_git_global: Option<bool>,
pub no_git_exclude: Option<bool>,
pub custom_ignore_path: Option<String>,
pub ignore_patterns: Option<Vec<String>>,
pub include_patterns: Option<Vec<String>>,
pub follow_symlinks: Option<bool>,
pub hidden: Option<bool>,
pub max_depth: Option<u32>,
pub permissions_filter: Option<u32>,
pub max_file_size_for_content: Option<u32>,
pub skip_content: Option<bool>,
pub text_detection_ratio: Option<u32>, pub text_detection_buffer_size: Option<u32>,
pub num_walker_threads: Option<u32>,
pub num_processor_threads: Option<u32>,
pub channel_capacity: Option<u32>,
pub modified_after_timestamp: Option<u32>,
pub modified_before_timestamp: Option<u32>,
pub model: Option<String>,
}
#[napi(object)]
pub struct LlmTextOpts {
pub format: Option<LlmTextFormat>,
pub show_permissions: Option<bool>,
pub show_size: Option<bool>,
pub show_modified: Option<bool>,
pub omit_file_contents: Option<bool>,
pub include_tree_outline: Option<bool>,
pub parsable_format: Option<bool>,
pub omit_summary: Option<bool>,
pub include_source_details: Option<bool>,
}
impl From<ScanOpts> for dumpfs::fs::FsScannerOpts {
fn from(value: ScanOpts) -> Self {
use std::time::{Duration, SystemTime};
let mut opts = Self::default();
if let Some(no_gitignore) = value.no_gitignore {
opts.no_gitignore = no_gitignore;
}
if let Some(no_git_global) = value.no_git_global {
opts.no_git_global = no_git_global;
}
if let Some(no_git_exclude) = value.no_git_exclude {
opts.no_git_exclude = no_git_exclude;
}
if let Some(custom_ignore_path) = value.custom_ignore_path {
if !custom_ignore_path.is_empty() {
opts.custom_ignore_path = Some(std::path::PathBuf::from(custom_ignore_path));
}
}
if let Some(ignore_patterns) = value.ignore_patterns {
opts.ignore_patterns = ignore_patterns;
}
if let Some(include_patterns) = value.include_patterns {
opts.include_patterns = include_patterns;
}
if let Some(follow_symlinks) = value.follow_symlinks {
opts.follow_symlinks = follow_symlinks;
}
if let Some(hidden) = value.hidden {
opts.hidden = hidden;
}
if let Some(max_depth) = value.max_depth {
opts.max_depth = Some(max_depth as usize);
}
if let Some(modified_after_timestamp) = value.modified_after_timestamp {
opts.modified_after =
Some(SystemTime::UNIX_EPOCH + Duration::from_secs(modified_after_timestamp as u64));
opts.modified_after_timestamp = Some(modified_after_timestamp as u64);
}
if let Some(modified_before_timestamp) = value.modified_before_timestamp {
opts.modified_before =
Some(SystemTime::UNIX_EPOCH + Duration::from_secs(modified_before_timestamp as u64));
opts.modified_before_timestamp = Some(modified_before_timestamp as u64);
}
if let Some(permissions_filter) = value.permissions_filter {
opts.permissions_filter = Some(permissions_filter);
}
if let Some(max_file_size_for_content) = value.max_file_size_for_content {
opts.max_file_size_for_content = Some(max_file_size_for_content as u64);
}
if let Some(skip_content) = value.skip_content {
opts.skip_content = skip_content;
}
if let Some(text_detection_ratio) = value.text_detection_ratio {
opts.text_detection_ratio = text_detection_ratio as f32;
}
if let Some(text_detection_buffer_size) = value.text_detection_buffer_size {
opts.text_detection_buffer_size = text_detection_buffer_size as usize;
}
if let Some(num_walker_threads) = value.num_walker_threads {
opts.num_walker_threads = Some(num_walker_threads as usize);
}
if let Some(num_processor_threads) = value.num_processor_threads {
opts.num_processor_threads = Some(num_processor_threads as usize);
}
if let Some(channel_capacity) = value.channel_capacity {
opts.channel_capacity = channel_capacity as usize;
}
if let Some(model) = value.model {
opts.model = tk::Model::from_str(model.as_str()).ok();
}
opts
}
}
impl From<LlmTextOpts> for dumpfs::fs::FsFmtOpts {
fn from(value: LlmTextOpts) -> Self {
let mut opts = Self::default();
if let Some(format) = value.format {
opts.format = format.into();
}
if let Some(show_permissions) = value.show_permissions {
opts.show_permissions = show_permissions;
}
if let Some(show_size) = value.show_size {
opts.show_size = show_size;
}
if let Some(show_modified) = value.show_modified {
opts.show_modified = show_modified;
}
if let Some(omit_file_contents) = value.omit_file_contents {
opts.omit_file_contents = omit_file_contents;
}
if let Some(include_tree_outline) = value.include_tree_outline {
opts.include_tree_outline = include_tree_outline;
}
if let Some(parsable_format) = value.parsable_format {
opts.parsable_format = parsable_format;
}
if let Some(omit_summary) = value.omit_summary {
opts.omit_summary = omit_summary;
}
if let Some(include_source_details) = value.include_source_details {
opts.include_source_details = include_source_details;
}
opts
}
}
#[derive(Default)]
#[napi(string_enum)]
pub enum LlmTextFormat {
#[default]
Md,
Xml,
Json,
}
impl From<LlmTextFormat> for dumpfs::fs::FsWriteFormat {
fn from(value: LlmTextFormat) -> Self {
match value {
LlmTextFormat::Md => Self::Md,
LlmTextFormat::Xml => Self::Xml,
LlmTextFormat::Json => Self::Json,
}
}
}