1use std::env;
2use std::fs::File;
3use std::io::{self, Write};
4use std::path::{Path, PathBuf};
5
6#[derive(Clone, Debug)]
9pub enum SpawnMode {
10 Hints(HintsVars),
12 Command(CommandVars),
14}
15
16const MODE: &str = "QUTE_MODE";
17
18#[inline]
22pub fn mode() -> SpawnMode {
23 match unwrap_env(MODE).as_str() {
24 "hints" => SpawnMode::Hints(HintsVars),
25 "command" => SpawnMode::Command(CommandVars),
26 _ => panic!("invalid {} variable", MODE),
27 }
28}
29
30#[derive(Clone, Debug)]
34pub struct HintsVars;
35
36const HINTS_URL: &str = "QUTE_URL";
37const HINTS_SELECTED_TEXT: &str = "QUTE_SELECTED_TEXT";
38const HINTS_SELECTED_HTML: &str = "QUTE_SELECTED_HTML";
39
40impl HintsVars {
41 #[inline]
43 pub fn url() -> String {
44 unwrap_env(HINTS_URL)
45 }
46
47 #[inline]
49 pub fn selected_text(&self) -> String {
50 unwrap_env(HINTS_SELECTED_TEXT)
51 }
52
53 #[inline]
55 pub fn selected_html(&self) -> String {
56 unwrap_env(HINTS_SELECTED_HTML)
57 }
58}
59
60#[derive(Clone, Debug)]
64pub struct CommandVars;
65
66const COMMAND_URL: &str = "QUTE_URL";
67const COMMAND_TITLE: &str = "QUTE_TITLE";
68const COMMAND_SELECTED_TEXT: &str = "QUTE_SELECTED_TEXT";
69const COMMAND_COUNT: &str = "QUTE_COUNT";
70
71impl CommandVars {
72 #[inline]
74 pub fn url() -> String {
75 unwrap_env(COMMAND_URL)
76 }
77
78 #[inline]
80 pub fn title(&self) -> String {
81 unwrap_env(COMMAND_TITLE)
82 }
83
84 #[inline]
86 pub fn selected_text(&self) -> String {
87 unwrap_env(COMMAND_SELECTED_TEXT)
88 }
89
90 #[inline]
92 pub fn count(&self) -> String {
93 unwrap_env(COMMAND_COUNT)
94 }
95}
96
97const USER_AGENT: &str = "QUTE_USER_AGENT";
98
99#[inline]
101pub fn user_agent() -> String {
102 unwrap_env(USER_AGENT)
103}
104
105const HTML: &str = "QUTE_HTML";
106
107#[inline]
109pub fn html() -> PathBuf {
110 unwrap_env(HTML).into()
111}
112
113const TEXT: &str = "QUTE_TEXT";
114
115#[inline]
117pub fn text() -> PathBuf {
118 unwrap_env(TEXT).into()
119}
120
121#[derive(Clone, Debug)]
123pub struct Fifo {
124 path: PathBuf,
125}
126
127impl Fifo {
128 #[inline]
129 pub fn new<P: AsRef<Path>>(path: P) -> Self {
130 Fifo {
131 path: path.as_ref().into(),
132 }
133 }
134
135 #[inline]
137 pub fn file(&self) -> Result<File, io::Error> {
138 File::open(&self.path)
139 }
140
141 #[inline]
148 pub fn write(&self, message: &str) -> Result<(), io::Error> {
149 let mut file = self.file()?;
150 file.write_all(message.as_bytes())
151 }
152}
153
154const FIFO: &str = "QUTE_FIFO";
155
156#[inline]
160pub fn fifo() -> Fifo {
161 let fifo_str = unwrap_env(FIFO);
162 Fifo::new(fifo_str)
163}
164
165const CONFIG_DIR: &str = "QUTE_CONFIG_DIR";
166
167#[inline]
169pub fn config_dir() -> PathBuf {
170 unwrap_env(CONFIG_DIR).into()
171}
172
173const DATA_DIR: &str = "QUTE_DATA_DIR";
174
175#[inline]
177pub fn data_dir() -> PathBuf {
178 unwrap_env(DATA_DIR).into()
179}
180
181const DOWNLOAD_DIR: &str = "QUTE_DOWNLOAD_DIR";
182
183#[inline]
185pub fn download_dir() -> PathBuf {
186 unwrap_env(DOWNLOAD_DIR).into()
187}
188
189const COMMANDLINE_TEXT: &str = "QUTE_COMMANDLINE_TEXT";
190
191#[inline]
193pub fn commandline_text() -> String {
194 unwrap_env(COMMANDLINE_TEXT)
195}
196
197#[inline]
198fn unwrap_env(key: &str) -> String {
199 env::var(key).expect(&format!("variable {} not set", key))
200}