aboutsummaryrefslogtreecommitdiffstats
path: root/pkgs/by-name
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--pkgs/by-name/ts/tskm/src/interface/input/mod.rs169
1 files changed, 75 insertions, 94 deletions
diff --git a/pkgs/by-name/ts/tskm/src/interface/input/mod.rs b/pkgs/by-name/ts/tskm/src/interface/input/mod.rs
index 5485de3b..747ba349 100644
--- a/pkgs/by-name/ts/tskm/src/interface/input/mod.rs
+++ b/pkgs/by-name/ts/tskm/src/interface/input/mod.rs
@@ -9,12 +9,7 @@
// If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
use std::{
- collections::HashSet,
- fmt::Display,
- fs::{self, read_to_string, File},
- io::Write,
- path::PathBuf,
- process::Command,
+ collections::HashSet, fmt::Display, fs, io::Write, path::PathBuf, process::Command,
str::FromStr,
};
@@ -26,28 +21,37 @@ pub mod handle;
pub use handle::handle;
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
-pub struct NoWhitespaceString(String);
+pub struct Tag(String);
-impl NoWhitespaceString {
- /// # Panics
- /// If the input contains whitespace.
- #[must_use]
- pub fn new(input: String) -> Self {
- if input.contains(' ') {
- panic!("Your input '{input}' contains whitespace. I did not expect that.")
+impl Tag {
+ pub fn new(input: &str) -> Result<Self> {
+ Self::from_str(input)
+ }
+}
+
+impl FromStr for Tag {
+ type Err = anyhow::Error;
+
+ fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
+ if let Some(tag) = s.strip_prefix('+') {
+ if tag.contains(' ') {
+ bail!("Your tag '{s}' should not whitespace.")
+ }
+
+ Ok(Self(tag.to_owned()))
} else {
- Self(input)
+ bail!("Your tag '{s}' does not start with the required '+'");
}
}
}
-impl Display for NoWhitespaceString {
+impl Display for Tag {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
- self.0.fmt(f)
+ write!(f, "+{}", self.0)
}
}
-impl NoWhitespaceString {
+impl Tag {
#[must_use]
pub fn as_str(&self) -> &str {
&self.0
@@ -57,7 +61,7 @@ impl NoWhitespaceString {
#[derive(Debug, Clone)]
pub struct Input {
url: Url,
- tags: HashSet<NoWhitespaceString>,
+ tags: HashSet<Tag>,
}
impl FromStr for Input {
@@ -71,13 +75,7 @@ impl FromStr for Input {
tags: {
tags.trim()
.split(' ')
- .map(|tag| {
- if let Some(tag) = tag.strip_prefix('+') {
- Ok(NoWhitespaceString::new(tag.to_owned()))
- } else {
- bail!("Your tag '{tag}' does not start with the required '+'");
- }
- })
+ .map(Tag::new)
.collect::<Result<_, _>>()?
},
})
@@ -101,13 +99,9 @@ impl Display for Input {
self.url,
self.tags
.iter()
- .fold(String::new(), |mut acc, tag| {
- acc.push('+');
- acc.push_str(tag.as_str());
- acc.push(' ');
- acc
- })
- .trim()
+ .map(ToString::to_string)
+ .collect::<Vec<_>>()
+ .join(" ")
)
}
}
@@ -123,7 +117,10 @@ impl Input {
fn url_path(url: &Url) -> Result<PathBuf> {
let base_path = Self::base_path();
- let url_path = base_path.join(url.to_string());
+ let url_path = base_path
+ .join(url.scheme())
+ .join(url.host_str().unwrap_or("<No Host>"))
+ .join(url.path().trim_matches('/'));
fs::create_dir_all(&url_path)
.with_context(|| format!("Failed to open file: '{}'", url_path.display()))?;
@@ -142,17 +139,12 @@ impl Input {
pub fn commit(&self) -> Result<()> {
let url_path = Self::url_path(&self.url)?;
- let url_content = {
- if url_path.exists() {
- read_to_string(&url_path)?
- } else {
- String::new()
- }
- };
-
- let mut file = File::create(&url_path)
+ let mut file = fs::OpenOptions::new()
+ .create(true)
+ .append(true)
+ .open(&url_path)
.with_context(|| format!("Failed to open file: '{}'", url_path.display()))?;
- writeln!(file, "{url_content}{self}")?;
+ writeln!(file, "{self}")?;
Self::git_commit(&format!("Add new url: '{self}'"))?;
@@ -183,27 +175,6 @@ impl Input {
Ok(())
}
- /// Commit your changes
- fn git_commit(message: &str) -> Result<()> {
- let status = Command::new("git")
- .args(["add", "."])
- .current_dir(Self::base_path())
- .status()?;
- if !status.success() {
- bail!("Git add . failed!");
- }
-
- let status = Command::new("git")
- .args(["commit", "--message", message, "--no-gpg-sign"])
- .current_dir(Self::base_path())
- .status()?;
- if !status.success() {
- bail!("Git commit failed!");
- }
-
- Ok(())
- }
-
/// Get all previously [`Self::commit`]ed inputs.
///
/// # Errors
@@ -227,41 +198,51 @@ impl Input {
continue;
}
- let url_value_file = entry
- .path()
- .to_str()
- .expect("All of these should be URLs and thus valid strings");
- assert!(url_value_file.ends_with("/url_value"));
-
- let url = {
- let base = url_value_file
- .strip_prefix(&format!("{}/", Self::base_path().display()))
- .expect("This will exist");
+ let url_value_file = entry.path();
+ assert!(url_value_file.ends_with("url_value"));
- let (proto, path) = base.split_once(':').expect("This will countain a :");
+ let url_values = fs::read_to_string(PathBuf::from(url_value_file))?;
- let path = path.strip_suffix("/url_value").expect("Will exist");
-
- Url::from_str(&format!("{proto}:/{path}"))
- .expect("This was a URL, it should still be one")
- };
- let tags = {
- let url_values = read_to_string(PathBuf::from(url_value_file))?;
+ output.extend(
url_values
.lines()
- .map(|line| {
- let input = Self::from_str(line)?;
- Ok::<_, anyhow::Error>(input.tags)
- })
- .collect::<Result<Vec<HashSet<NoWhitespaceString>>, _>>()?
- .into_iter()
- .flatten()
- .collect()
- };
-
- output.push(Self { url, tags });
+ .map(Self::from_str)
+ .collect::<Result<Vec<Self>, _>>()?
+ .into_iter(),
+ );
}
Ok(output)
}
+
+ /// Commit your changes
+ fn git_commit(message: &str) -> Result<()> {
+ if !Self::base_path().join(".git").exists() {
+ let status = Command::new("git")
+ .args(["init"])
+ .current_dir(Self::base_path())
+ .status()?;
+ if !status.success() {
+ bail!("Git init failed!");
+ }
+ }
+
+ let status = Command::new("git")
+ .args(["add", "."])
+ .current_dir(Self::base_path())
+ .status()?;
+ if !status.success() {
+ bail!("Git add . failed!");
+ }
+
+ let status = Command::new("git")
+ .args(["commit", "--message", message, "--no-gpg-sign"])
+ .current_dir(Self::base_path())
+ .status()?;
+ if !status.success() {
+ bail!("Git commit failed!");
+ }
+
+ Ok(())
+ }
}