paperless-cli 2.1.0

Rust TUI and LLM-friendly client for Paperless-ngx
Documentation
use std::collections::BTreeMap;

use serde::{Deserialize, Serialize};
use serde_json::Value;

#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)]
pub struct Document {
    pub id: i64,
    #[serde(default)]
    pub title: String,
    #[serde(default)]
    pub created: String,
    #[serde(default)]
    pub tags: Vec<i64>,
    #[serde(default)]
    pub document_type: Option<i64>,
    #[serde(default)]
    pub correspondent: Option<i64>,
    #[serde(flatten)]
    pub extra: BTreeMap<String, Value>,
}

#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)]
pub struct SimpleItem {
    pub id: i64,
    #[serde(default)]
    pub name: String,
    #[serde(flatten)]
    pub extra: BTreeMap<String, Value>,
}

#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)]
pub struct Task {
    pub id: i64,
    #[serde(default)]
    pub status: String,
    #[serde(default)]
    pub task_file_name: String,
    #[serde(flatten)]
    pub extra: BTreeMap<String, Value>,
}

#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)]
pub struct Paginated<T> {
    pub count: usize,
    #[serde(default)]
    pub next: Option<String>,
    #[serde(default)]
    pub previous: Option<String>,
    #[serde(default)]
    pub results: Vec<T>,
}

#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)]
pub struct SessionState {
    #[serde(default)]
    pub last_query: String,
    #[serde(default)]
    pub selected_docs: Vec<i64>,
    #[serde(default)]
    pub history: Vec<String>,
}

impl SessionState {
    pub fn add_history(&mut self, command: impl Into<String>) {
        self.history.push(command.into());
        if self.history.len() > 500 {
            let split_index = self.history.len() - 500;
            self.history.drain(0..split_index);
        }
    }

    pub fn clear_selection(&mut self) {
        self.selected_docs.clear();
    }
}

#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
pub struct DownloadResult {
    pub doc_id: i64,
    pub path: Option<String>,
    pub status: String,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub error: Option<String>,
}

#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)]
pub struct DashboardData {
    pub connected: bool,
    pub url: Option<String>,
    pub documents: Vec<Document>,
    pub tasks: Vec<Task>,
    pub tags: Vec<SimpleItem>,
    pub message: String,
}