summaryrefslogtreecommitdiffstats
path: root/src/types
diff options
context:
space:
mode:
authorManos Pitsidianakis <el13635@mail.ntua.gr>2020-02-04 15:52:12 +0200
committerManos Pitsidianakis <el13635@mail.ntua.gr>2020-02-04 17:29:55 +0200
commit8b6ea8de9a89b3ad42276eb7835992f7b875128b (patch)
tree864a7136b4c23d76761ee3e7d034307f8c302838 /src/types
parent6fcc792b83f715644c041f728049de65f7da2e38 (diff)
Remove ui crate
Merge ui crate with root crate. In preparation for uploading `meli` as a separate crate on crates.io. Workspace crates will need to be published as well and having a separate `ui` crate and binary perhaps doesn't make sense anymore.
Diffstat (limited to 'src/types')
-rw-r--r--src/types/helpers.rs106
1 files changed, 106 insertions, 0 deletions
diff --git a/src/types/helpers.rs b/src/types/helpers.rs
new file mode 100644
index 00000000..ac089e28
--- /dev/null
+++ b/src/types/helpers.rs
@@ -0,0 +1,106 @@
+/*
+ * meli
+ *
+ * Copyright 2017-2018 Manos Pitsidianakis
+ *
+ * This file is part of meli.
+ *
+ * meli is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * meli is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with meli. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+use std;
+use std::fs;
+use std::fs::OpenOptions;
+use std::io::{Read, Write};
+use std::os::unix::fs::PermissionsExt;
+use std::path::PathBuf;
+
+use uuid::Uuid;
+
+#[derive(Debug)]
+pub struct File {
+ pub path: PathBuf,
+ delete_on_drop: bool,
+}
+
+impl Drop for File {
+ fn drop(&mut self) {
+ if self.delete_on_drop {
+ std::fs::remove_file(self.path()).unwrap_or_else(|_| {});
+ }
+ }
+}
+
+impl File {
+ pub fn file(&mut self) -> std::fs::File {
+ OpenOptions::new()
+ .read(true)
+ .write(true)
+ .create(true)
+ .open(&self.path)
+ .unwrap()
+ }
+
+ pub fn path(&self) -> &PathBuf {
+ &self.path
+ }
+ pub fn read_to_string(&self) -> String {
+ let mut buf = Vec::new();
+ let mut f = fs::File::open(&self.path)
+ .unwrap_or_else(|_| panic!("Can't open {}", &self.path.display()));
+ f.read_to_end(&mut buf)
+ .unwrap_or_else(|_| panic!("Can't read {}", &self.path.display()));
+ String::from_utf8(buf).unwrap()
+ }
+}
+
+/// Returned `File` will be deleted when dropped if delete_on_drop is set, so make sure to add it on `context.temp_files`
+/// to reap it later.
+pub fn create_temp_file(
+ bytes: &[u8],
+ filename: Option<&str>,
+ path: Option<&PathBuf>,
+ delete_on_drop: bool,
+) -> File {
+ let mut dir = std::env::temp_dir();
+
+ let path = path.unwrap_or_else(|| {
+ dir.push("meli");
+ std::fs::DirBuilder::new()
+ .recursive(true)
+ .create(&dir)
+ .unwrap();
+ if let Some(filename) = filename {
+ dir.push(filename)
+ } else {
+ let u = Uuid::new_v4();
+ dir.push(u.to_hyphenated().to_string());
+ }
+ &dir
+ });
+
+ let mut f = std::fs::File::create(path).unwrap();
+ let metadata = f.metadata().unwrap();
+ let mut permissions = metadata.permissions();
+
+ permissions.set_mode(0o600); // Read/write for owner only.
+ f.set_permissions(permissions).unwrap();
+
+ f.write_all(bytes).unwrap();
+ f.flush().unwrap();
+ File {
+ path: path.clone(),
+ delete_on_drop,
+ }
+}