+26
-1
upload/src/main.rs
+26
-1
upload/src/main.rs
···
1
1
use clap::{ArgAction, Parser};
2
2
use std::path::PathBuf;
3
3
4
+
use crate::utils::url_to_rkey;
5
+
4
6
mod sitemap;
5
7
mod utils;
6
8
···
50
52
);
51
53
52
54
// get local site info
53
-
let sitemap = sitemap::local_sitemap(config.dir, config.all_files, config.git_ignore);
55
+
let sitemap =
56
+
sitemap::local_sitemap(config.dir, config.all_files, config.git_ignore).or_else(|err| {
57
+
println!("Error: {}", err);
58
+
Err(())
59
+
})?;
60
+
61
+
println!(
62
+
"{}",
63
+
sitemap
64
+
.iter()
65
+
.map(|(k, v)| {
66
+
let rkey = url_to_rkey(k.to_string());
67
+
if let Some(rkey) = rkey {
68
+
return format!(
69
+
"\t\t\t\t\t\t\t\t\t\t\t\t{:?}\r\t\t\t\t\t\t\t\t{}\r - {}",
70
+
v.blob, v.mime_type, rkey
71
+
);
72
+
} else {
73
+
return String::new();
74
+
}
75
+
})
76
+
.collect::<Vec<_>>()
77
+
.join("\n")
78
+
);
54
79
55
80
// create session
56
81
+40
-42
upload/src/sitemap.rs
+40
-42
upload/src/sitemap.rs
···
1
1
use ignore::WalkBuilder;
2
+
use mime_guess::mime;
2
3
use std::{collections::HashMap, error::Error, fmt, path::PathBuf};
3
4
4
5
pub type Sitemap = HashMap<String, SitemapNode>;
···
19
20
pub enum SitemapErr {
20
21
IoErr(std::io::Error),
21
22
IgnoreErr(ignore::Error),
23
+
StripPrefixErr(std::path::StripPrefixError),
24
+
NotUTF8Path,
22
25
}
23
26
24
27
impl From<std::io::Error> for SitemapErr {
···
33
36
}
34
37
}
35
38
39
+
impl From<std::path::StripPrefixError> for SitemapErr {
40
+
fn from(value: std::path::StripPrefixError) -> Self {
41
+
SitemapErr::StripPrefixErr(value)
42
+
}
43
+
}
44
+
36
45
impl Error for SitemapErr {}
37
46
38
47
impl fmt::Display for SitemapErr {
···
40
49
match self {
41
50
SitemapErr::IoErr(err) => write!(f, "IO Error: {}", err),
42
51
SitemapErr::IgnoreErr(err) => write!(f, "Ignore Error: {}", err),
52
+
SitemapErr::StripPrefixErr(err) => write!(f, "File Path Error: {}", err),
53
+
SitemapErr::NotUTF8Path => write!(f, "Found a path that was not UTF-8"),
43
54
}
44
55
}
45
56
}
···
49
60
include_dotfiles: bool,
50
61
use_gitignore: bool,
51
62
) -> Result<Sitemap, SitemapErr> {
52
-
let res = WalkBuilder::new(dir)
63
+
let prefix = dir.canonicalize()?;
64
+
65
+
let mut res = HashMap::new();
66
+
for file in WalkBuilder::new(dir)
53
67
.hidden(!include_dotfiles)
54
68
.git_ignore(use_gitignore)
55
69
.git_exclude(use_gitignore)
56
70
.git_global(use_gitignore)
57
71
.follow_links(true)
58
72
.build()
59
-
.filter_map(|x| {
60
-
let x = x
61
-
.or_else(|err| {
62
-
println!("Warning: {} ", err);
63
-
Err(())
64
-
})
65
-
.ok()?;
73
+
{
74
+
let file = file?;
66
75
67
-
let metadata = x
68
-
.metadata()
69
-
.or_else(|err| {
70
-
println!("Warning on file {}:\n{} ", x.path().display(), err);
71
-
Err(())
72
-
})
73
-
.ok()?;
74
-
75
-
if !metadata.is_file() {
76
-
return None;
77
-
};
76
+
let metadata = file.metadata()?;
78
77
79
-
let key = x.path().to_str()?;
80
-
let key = String::from(key);
81
-
82
-
let mime = mime_guess::from_path(&key);
83
-
let mime = mime.first()?;
84
-
let mime = mime.essence_str();
78
+
if !metadata.is_file() {
79
+
continue;
80
+
};
85
81
86
-
Some((
87
-
key,
88
-
SitemapNode {
89
-
mime_type: String::from(mime),
90
-
blob: BlobRef::Local(x.path().to_owned()),
91
-
},
92
-
))
93
-
})
94
-
.collect::<HashMap<_, _>>();
82
+
// find the path of the files relative to the source directory
83
+
// source dir `./dist`:
84
+
// ./dist/index.html => index.html
85
+
// ./dist/assets/cat.jpg => cat.jpg
86
+
// etc
87
+
let key = file.path().canonicalize()?;
88
+
let key = key.strip_prefix(&prefix)?;
89
+
let key = String::from(key.to_str().ok_or_else(|| SitemapErr::NotUTF8Path)?);
95
90
96
-
println!(
97
-
" - {}",
98
-
res
99
-
.iter()
100
-
.map(|(k, v)| format!("{}: {:?}", k, v))
101
-
.collect::<Vec<_>>()
102
-
.join("\n - ")
103
-
);
91
+
let mime = mime_guess::from_path(&key);
92
+
let mime = mime.first().unwrap_or(mime::APPLICATION_OCTET_STREAM);
93
+
let mime = mime.essence_str();
104
94
95
+
res.insert(
96
+
key,
97
+
SitemapNode {
98
+
mime_type: String::from(mime),
99
+
blob: BlobRef::Local(file.path().to_owned()),
100
+
},
101
+
);
102
+
}
105
103
Ok(res)
106
104
}