perspective_viewer/config/
export_method.rs1use std::rc::Rc;
14
15use serde::Deserialize;
16use yew::prelude::*;
17
18use crate::js::*;
19
20#[derive(Clone, Copy, Eq, PartialEq, Deserialize, ts_rs::TS)]
21pub enum ExportMethod {
22 #[serde(rename = "csv")]
23 Csv,
24
25 #[serde(rename = "csv-all")]
26 CsvAll,
27
28 #[serde(rename = "csv-selected")]
29 CsvSelected,
30
31 #[serde(rename = "json")]
32 Json,
33
34 #[serde(rename = "json-all")]
35 JsonAll,
36
37 #[serde(rename = "json-selected")]
38 JsonSelected,
39
40 #[serde(rename = "ndjson")]
49 Ndjson,
50
51 #[serde(rename = "ndjson-all")]
52 NdjsonAll,
53
54 #[serde(rename = "ndjson-selected")]
55 NdjsonSelected,
56
57 #[serde(rename = "html")]
58 Html,
59
60 #[serde(rename = "plugin")]
61 Plugin,
62
63 #[serde(rename = "arrow")]
64 Arrow,
65
66 #[serde(rename = "arrow-selected")]
67 ArrowSelected,
68
69 #[serde(rename = "arrow-all")]
70 ArrowAll,
71
72 #[serde(rename = "arrow-lz4")]
73 ArrowLz4,
74
75 #[serde(rename = "arrow-lz4-selected")]
76 ArrowLz4Selected,
77
78 #[serde(rename = "arrow-lz4-all")]
79 ArrowLz4All,
80
81 #[serde(rename = "arrow-zstd")]
82 ArrowZstd,
83
84 #[serde(rename = "arrow-zstd-selected")]
85 ArrowZstdSelected,
86
87 #[serde(rename = "arrow-zstd-all")]
88 ArrowZstdAll,
89
90 #[serde(rename = "json-config")]
91 JsonConfig,
92}
93
94impl ExportMethod {
95 pub const fn as_filename(&self, is_chart: bool) -> &'static str {
96 match self {
97 Self::Csv => ".csv",
98 Self::CsvAll => ".all.csv",
99 Self::Json => ".json",
100 Self::JsonAll => ".all.json",
101 Self::Html => ".html",
102 Self::Plugin => {
103 if is_chart {
104 ".png"
105 } else {
106 ".txt"
107 }
108 },
109 Self::Arrow => ".arrow",
110 Self::ArrowAll => ".all.arrow",
111 Self::JsonConfig => ".config.json",
112 Self::CsvSelected => ".selected.csv",
113 Self::JsonSelected => ".selected.json",
114 Self::ArrowSelected => ".selected.arrow",
115 Self::ArrowLz4 => ".lz4.arrow",
116 Self::ArrowLz4Selected => ".selected.lz4.arrow",
117 Self::ArrowLz4All => ".all.lz4.arrow",
118 Self::ArrowZstd => ".zstd.arrow",
119 Self::ArrowZstdSelected => ".selected.zstd.arrow",
120 Self::ArrowZstdAll => ".all.zstd.arrow",
121 Self::Ndjson => ".ndjson",
122 Self::NdjsonAll => ".all.ndjson",
123 Self::NdjsonSelected => ".selected.ndjson",
124 }
128 }
129
130 pub const fn mimetype(&self, is_chart: bool) -> MimeType {
131 match self {
132 Self::Plugin if is_chart => MimeType::ImagePng,
133 _ => MimeType::TextPlain,
134 }
135 }
136
137 pub fn to_html(&self, is_chart: bool) -> Html {
138 html! { <code>{ self.as_filename(is_chart) }</code> }
139 }
140}
141
142impl ExportMethod {
143 pub fn new_file(&self, x: &str, is_chart: bool) -> ExportFile {
144 ExportFile {
145 name: Rc::new(x.to_owned()),
146 method: *self,
147 is_chart,
148 }
149 }
150}
151
152#[derive(Clone, Eq, PartialEq)]
153pub struct ExportFile {
154 pub name: Rc<String>,
155 pub method: ExportMethod,
156 pub is_chart: bool,
157}
158
159impl ExportFile {
160 pub fn as_filename(&self, is_chart: bool) -> String {
161 format!("{}{}", self.name, self.method.as_filename(is_chart))
162 }
163}
164
165impl From<ExportFile> for Html {
166 fn from(x: ExportFile) -> Self {
167 let class = if x.name.is_empty() {
168 Some("invalid")
169 } else {
170 None
171 };
172
173 html! { <code {class}>{ x.name }{ x.method.as_filename(x.is_chart) }</code> }
174 }
175}