Rust · 2521 bytes Raw Blame History
1 //! garcalc-doc: Document format
2 //!
3 //! Provides document structure for calculator pages, graphs,
4 //! geometry, spreadsheets, and notes.
5 //!
6 //! This is a stub for Sprint 6-7 implementation.
7
8 use std::collections::HashMap;
9
10 use garcalc_cas::Expr;
11 use serde::{Deserialize, Serialize};
12
13 /// A garcalc document (similar to TI-Nspire .tns)
14 #[derive(Debug, Clone, Serialize, Deserialize)]
15 pub struct Document {
16 pub version: u32,
17 pub metadata: DocumentMetadata,
18 pub pages: Vec<Page>,
19 pub variables: HashMap<String, Expr>,
20 }
21
22 impl Default for Document {
23 fn default() -> Self {
24 Self {
25 version: 1,
26 metadata: DocumentMetadata::default(),
27 pages: vec![Page::Calculator(CalculatorPage::default())],
28 variables: HashMap::new(),
29 }
30 }
31 }
32
33 /// Document metadata
34 #[derive(Debug, Clone, Default, Serialize, Deserialize)]
35 pub struct DocumentMetadata {
36 pub title: String,
37 pub created: Option<String>,
38 pub modified: Option<String>,
39 }
40
41 /// A page within a document
42 #[derive(Debug, Clone, Serialize, Deserialize)]
43 #[serde(tag = "type", rename_all = "snake_case")]
44 pub enum Page {
45 Calculator(CalculatorPage),
46 Graph(GraphPage),
47 Geometry(GeometryPage),
48 Spreadsheet(SpreadsheetPage),
49 Notes(NotesPage),
50 }
51
52 /// Calculator page with expression history
53 #[derive(Debug, Clone, Default, Serialize, Deserialize)]
54 pub struct CalculatorPage {
55 pub entries: Vec<CalculatorEntry>,
56 }
57
58 /// A single calculation entry
59 #[derive(Debug, Clone, Serialize, Deserialize)]
60 pub struct CalculatorEntry {
61 pub input: String,
62 #[serde(skip_serializing_if = "Option::is_none")]
63 pub result: Option<String>,
64 #[serde(skip_serializing_if = "Option::is_none")]
65 pub error: Option<String>,
66 }
67
68 /// Graph page (stub)
69 #[derive(Debug, Clone, Default, Serialize, Deserialize)]
70 pub struct GraphPage {
71 pub functions: Vec<String>,
72 }
73
74 /// Geometry page (stub)
75 #[derive(Debug, Clone, Default, Serialize, Deserialize)]
76 pub struct GeometryPage {
77 pub shapes: Vec<String>,
78 }
79
80 /// Spreadsheet page
81 #[derive(Debug, Clone, Default, Serialize, Deserialize)]
82 pub struct SpreadsheetPage {
83 pub cells: HashMap<String, Cell>,
84 pub rows: usize,
85 pub cols: usize,
86 }
87
88 /// Spreadsheet cell
89 #[derive(Debug, Clone, Serialize, Deserialize)]
90 pub struct Cell {
91 pub formula: Option<String>,
92 pub value: Option<String>,
93 }
94
95 /// Notes page (stub)
96 #[derive(Debug, Clone, Default, Serialize, Deserialize)]
97 pub struct NotesPage {
98 pub content: String,
99 }
100