systemprompt-files 0.1.21

File management module for systemprompt.io
Documentation
use serde::{Deserialize, Serialize};

const DEFAULT_URL_PREFIX: &str = "/files";
pub(super) const DEFAULT_MAX_FILE_SIZE_BYTES: u64 = 50 * 1024 * 1024;

#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum FilePersistenceMode {
    #[default]
    ContextScoped,
    UserLibrary,
    Disabled,
}

#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
#[allow(clippy::struct_excessive_bools)]
pub struct AllowedFileTypes {
    pub images: bool,
    pub documents: bool,
    pub audio: bool,
    pub video: bool,
}

impl Default for AllowedFileTypes {
    fn default() -> Self {
        Self {
            images: true,
            documents: true,
            audio: true,
            video: false,
        }
    }
}

#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
pub struct FileUploadConfig {
    #[serde(default = "default_enabled")]
    pub enabled: bool,
    #[serde(default = "default_max_file_size")]
    pub max_file_size_bytes: u64,
    #[serde(default)]
    pub persistence_mode: FilePersistenceMode,
    #[serde(default)]
    pub allowed_types: AllowedFileTypes,
}

const fn default_enabled() -> bool {
    true
}

const fn default_max_file_size() -> u64 {
    DEFAULT_MAX_FILE_SIZE_BYTES
}

impl Default for FileUploadConfig {
    fn default() -> Self {
        Self {
            enabled: true,
            max_file_size_bytes: DEFAULT_MAX_FILE_SIZE_BYTES,
            persistence_mode: FilePersistenceMode::default(),
            allowed_types: AllowedFileTypes::default(),
        }
    }
}

#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct FilesConfigYaml {
    #[serde(default = "default_url_prefix")]
    pub url_prefix: String,
    #[serde(default)]
    pub upload: FileUploadConfig,
}

fn default_url_prefix() -> String {
    DEFAULT_URL_PREFIX.to_string()
}

impl Default for FilesConfigYaml {
    fn default() -> Self {
        Self {
            url_prefix: default_url_prefix(),
            upload: FileUploadConfig::default(),
        }
    }
}

#[derive(Debug, Clone, Serialize, Deserialize)]
pub(super) struct FilesConfigWrapper {
    #[serde(default)]
    pub files: FilesConfigYaml,
}