[WIP] A (somewhat barebones) atproto app for creating custom sites without hosting!

upload: strip source dir prefix from key and minor refactor

hashmap key no longer includes the source directory from the cli arguments
source dir `./dist`:
./dist/index.html => index.html
./dist/assets/cat.jpg => cat.jpg
etc

refactor things and log the tree state in main bc its debugging info

vielle.dev c0866727 deae99f7

verified
Changed files
+66 -43
upload
+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
··· 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 }