use std::env;
use std::fs::File;
use std::io::{self, Write};
use std::path::{Path, PathBuf};
#[derive(Clone, Debug)]
pub enum SpawnMode {
Hints(HintsVars),
Command(CommandVars),
}
const MODE: &str = "QUTE_MODE";
#[inline]
pub fn mode() -> SpawnMode {
match unwrap_env(MODE).as_str() {
"hints" => SpawnMode::Hints(HintsVars),
"command" => SpawnMode::Command(CommandVars),
_ => panic!("invalid {} variable", MODE),
}
}
#[derive(Clone, Debug)]
pub struct HintsVars;
const HINTS_URL: &str = "QUTE_URL";
const HINTS_SELECTED_TEXT: &str = "QUTE_SELECTED_TEXT";
const HINTS_SELECTED_HTML: &str = "QUTE_SELECTED_HTML";
impl HintsVars {
#[inline]
pub fn url() -> String {
unwrap_env(HINTS_URL)
}
#[inline]
pub fn selected_text(&self) -> String {
unwrap_env(HINTS_SELECTED_TEXT)
}
#[inline]
pub fn selected_html(&self) -> String {
unwrap_env(HINTS_SELECTED_HTML)
}
}
#[derive(Clone, Debug)]
pub struct CommandVars;
const COMMAND_URL: &str = "QUTE_URL";
const COMMAND_TITLE: &str = "QUTE_TITLE";
const COMMAND_SELECTED_TEXT: &str = "QUTE_SELECTED_TEXT";
const COMMAND_COUNT: &str = "QUTE_COUNT";
impl CommandVars {
#[inline]
pub fn url() -> String {
unwrap_env(COMMAND_URL)
}
#[inline]
pub fn title(&self) -> String {
unwrap_env(COMMAND_TITLE)
}
#[inline]
pub fn selected_text(&self) -> String {
unwrap_env(COMMAND_SELECTED_TEXT)
}
#[inline]
pub fn count(&self) -> String {
unwrap_env(COMMAND_COUNT)
}
}
const USER_AGENT: &str = "QUTE_USER_AGENT";
#[inline]
pub fn user_agent() -> String {
unwrap_env(USER_AGENT)
}
const HTML: &str = "QUTE_HTML";
#[inline]
pub fn html() -> PathBuf {
unwrap_env(HTML).into()
}
const TEXT: &str = "QUTE_TEXT";
#[inline]
pub fn text() -> PathBuf {
unwrap_env(TEXT).into()
}
#[derive(Clone, Debug)]
pub struct Fifo {
path: PathBuf,
}
impl Fifo {
#[inline]
pub fn new<P: AsRef<Path>>(path: P) -> Self {
Fifo {
path: path.as_ref().into(),
}
}
#[inline]
pub fn file(&self) -> Result<File, io::Error> {
File::open(&self.path)
}
#[inline]
pub fn write(&self, message: &str) -> Result<(), io::Error> {
let mut file = self.file()?;
file.write_all(message.as_bytes())
}
}
const FIFO: &str = "QUTE_FIFO";
#[inline]
pub fn fifo() -> Fifo {
let fifo_str = unwrap_env(FIFO);
Fifo::new(fifo_str)
}
const CONFIG_DIR: &str = "QUTE_CONFIG_DIR";
#[inline]
pub fn config_dir() -> PathBuf {
unwrap_env(CONFIG_DIR).into()
}
const DATA_DIR: &str = "QUTE_DATA_DIR";
#[inline]
pub fn data_dir() -> PathBuf {
unwrap_env(DATA_DIR).into()
}
const DOWNLOAD_DIR: &str = "QUTE_DOWNLOAD_DIR";
#[inline]
pub fn download_dir() -> PathBuf {
unwrap_env(DOWNLOAD_DIR).into()
}
const COMMANDLINE_TEXT: &str = "QUTE_COMMANDLINE_TEXT";
#[inline]
pub fn commandline_text() -> String {
unwrap_env(COMMANDLINE_TEXT)
}
#[inline]
fn unwrap_env(key: &str) -> String {
env::var(key).expect(&format!("variable {} not set", key))
}