Skip to main content

perspective_viewer/config/
export_method.rs

1// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
2// ┃ ██████ ██████ ██████       █      █      █      █      █ █▄  ▀███ █       ┃
3// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█  ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄  ▀█ █ ▀▀▀▀▀ ┃
4// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄   █ ▄▄▄▄▄ ┃
5// ┃ █      ██████ █  ▀█▄       █ ██████      █      ███▌▐███ ███████▄ █       ┃
6// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
7// ┃ Copyright (c) 2017, the Perspective Authors.                              ┃
8// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃
9// ┃ This file is part of the Perspective library, distributed under the terms ┃
10// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃
11// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
12
13use 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 = "columns")]
41    // JsonColumns,
42
43    // #[serde(rename = "columns-all")]
44    // JsonColumnsAll,
45
46    // #[serde(rename = "columns-selected")]
47    // JsonColumnsSelected,
48    #[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            // Self::JsonColumns => ".columns.json",
125            // Self::JsonColumnsAll => ".all.columns.json",
126            // Self::JsonColumnsSelected => ".selected.columns.json",
127        }
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}