cursive_open_editor/
strategy.rs1use std::{
2 io::{self},
3 path::PathBuf,
4};
5
6use tempfile::TempPath;
7
8#[derive(Debug, Clone, Default)]
10pub enum FindEditorStrategy {
11 #[default]
14 Envs,
15 AbsolutePath(PathBuf),
17}
18
19impl FindEditorStrategy {
20 pub fn absolute_path<P: Into<PathBuf>>(p: P) -> Self {
22 Self::AbsolutePath(p.into())
23 }
24
25 pub fn editor_path(self) -> Option<PathBuf> {
27 match self {
28 FindEditorStrategy::Envs => ["CURSIVE_EDITOR", "EDITOR", "VISUAL"]
29 .into_iter()
30 .find_map(|var_name| std::env::var_os(var_name))
31 .map(|os_str| os_str.into()),
32 FindEditorStrategy::AbsolutePath(it) => Some(it.to_owned()),
33 }
34 }
35}
36
37#[derive(Debug, Clone, Default)]
39pub enum EditPathStrategy {
40 #[default]
42 MakeTmp,
43 GivePath(PathBuf),
45}
46
47impl EditPathStrategy {
48 pub fn file_path(self) -> io::Result<EditPathStrategyOut> {
55 Ok(EditPathStrategyOut(match self {
56 EditPathStrategy::MakeTmp => {
57 let tmp = tempfile::NamedTempFile::new()?;
58 EditPathStrategyOutInner::MadeTmp(tmp.into_temp_path())
59 }
60 EditPathStrategy::GivePath(path) => {
61 EditPathStrategyOutInner::GivenPath(path.to_owned())
62 }
63 }))
64 }
65}
66
67pub struct EditPathStrategyOut(EditPathStrategyOutInner);
74
75pub(crate) enum EditPathStrategyOutInner {
76 GivenPath(PathBuf),
77 MadeTmp(TempPath),
78}
79
80impl EditPathStrategyOut {
81 pub fn path(&self) -> PathBuf {
83 match &self.0 {
84 EditPathStrategyOutInner::GivenPath(it) => it.to_owned(),
85 EditPathStrategyOutInner::MadeTmp(tmp_path) => tmp_path.to_path_buf(),
86 }
87 }
88
89 pub fn persist(&mut self) -> io::Result<()> {
93 let EditPathStrategyOutInner::MadeTmp(_) = &self.0 else {
94 return Ok(());
96 };
97 let EditPathStrategyOutInner::MadeTmp(it) = std::mem::replace(
99 &mut self.0,
100 EditPathStrategyOutInner::GivenPath("slhgdsf".into()),
101 ) else {
102 unreachable!()
103 };
104 match it.keep() {
105 Ok(path) => {
106 self.0 = EditPathStrategyOutInner::GivenPath(path);
107 Ok(())
108 }
109 Err(ono) => {
110 self.0 = EditPathStrategyOutInner::MadeTmp(ono.path);
112 Err(ono.error)
113 }
114 }
115 }
116}