initialization
This commit is contained in:
commit
cf6dcef6c1
11 changed files with 1481 additions and 0 deletions
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
/target
|
||||||
1323
Cargo.lock
generated
Normal file
1323
Cargo.lock
generated
Normal file
File diff suppressed because it is too large
Load diff
14
Cargo.toml
Normal file
14
Cargo.toml
Normal file
|
|
@ -0,0 +1,14 @@
|
||||||
|
[package]
|
||||||
|
name = "garden_server"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2024"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
tokio = { version = "1", features = [ "rt-multi-thread", "macros" ]}
|
||||||
|
tokio-macros = "2.6.0"
|
||||||
|
warp = { version = "0.4.2", features = [ "server" ] }
|
||||||
|
bytes = "1"
|
||||||
|
chrono = "0.4"
|
||||||
|
chrono-tz = "0.10"
|
||||||
|
notify-debouncer-full = "0.6"
|
||||||
|
rss = "2"
|
||||||
1
loam/footsteps/home_page.md
Normal file
1
loam/footsteps/home_page.md
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
28
|
||||||
1
loam/footsteps/new_new_page.md
Normal file
1
loam/footsteps/new_new_page.md
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
1
|
||||||
1
loam/footsteps/new_page.md
Normal file
1
loam/footsteps/new_page.md
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
2
|
||||||
1
loam/footsteps/test_page
Normal file
1
loam/footsteps/test_page
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
2
|
||||||
39
loam/signatures.md
Normal file
39
loam/signatures.md
Normal file
|
|
@ -0,0 +1,39 @@
|
||||||
|
---
|
||||||
|
|
||||||
|
Thanks for reading! :)testingtest2testingtestingtestingtestingtesting
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
testing
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
testing 2
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
testing 3
|
||||||
|
|
||||||
|
---
|
||||||
|
*Sat, mid January, 2026*
|
||||||
|
testing 3
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
*Sat, early January, 2026*
|
||||||
|
testing 5
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
*Saturday, early January, 2026*
|
||||||
|
testing 5
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
*Sunday, mid January 2026*
|
||||||
|
|
||||||
|
testing!
|
||||||
|
|
||||||
1
src/lib.rs
Normal file
1
src/lib.rs
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
pub mod site;
|
||||||
99
src/main.rs
Normal file
99
src/main.rs
Normal file
|
|
@ -0,0 +1,99 @@
|
||||||
|
use warp::Filter;
|
||||||
|
use std::{
|
||||||
|
fs, fs::File,
|
||||||
|
path::{
|
||||||
|
PathBuf,
|
||||||
|
},
|
||||||
|
io::Write,
|
||||||
|
};
|
||||||
|
use chrono::prelude::*;
|
||||||
|
use chrono_tz::America::Chicago;
|
||||||
|
use std::env;
|
||||||
|
|
||||||
|
fn sign(working_directory: PathBuf, body: bytes::Bytes) -> Option<usize> {
|
||||||
|
String::from_utf8(body.to_vec()).ok()
|
||||||
|
.and_then(|text| File::options().append(true).open(working_directory.join("signatures.md")).ok()
|
||||||
|
.and_then(|mut f| {
|
||||||
|
let now = Local::now().with_timezone(&Chicago);
|
||||||
|
let weekday = match now.weekday() {
|
||||||
|
Weekday::Mon => "Monday", Weekday::Tue => "Tuesday", Weekday::Wed => "Wednesday", Weekday::Thu => "Thursday",
|
||||||
|
Weekday::Fri => "Friday", Weekday::Sat => "Saturday", Weekday::Sun => "Sunday"
|
||||||
|
};
|
||||||
|
let day = now.day();
|
||||||
|
let prog = match day {
|
||||||
|
..=10 => "early",
|
||||||
|
11..=20 => "mid",
|
||||||
|
21.. => "late"
|
||||||
|
};
|
||||||
|
let month = match now.month() {
|
||||||
|
1 => "January", 2 => "February", 3 => "March", 4 => "April", 5 => "May", 6 => "June",
|
||||||
|
7 => "July", 8 => "August", 9 => "September", 10 => "October", 11 => "November", 12 => "December",
|
||||||
|
_ => "in the month"
|
||||||
|
};
|
||||||
|
let year = now.year();
|
||||||
|
|
||||||
|
let text = format!(
|
||||||
|
"
|
||||||
|
|
||||||
|
---
|
||||||
|
*{weekday}, {prog} {month} {year}*
|
||||||
|
|
||||||
|
{text}
|
||||||
|
|
||||||
|
"
|
||||||
|
);
|
||||||
|
f.write(text.as_bytes()).ok()
|
||||||
|
})
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn step(path: PathBuf) -> Option<usize> {
|
||||||
|
fs::read_to_string(&path).ok().or(Some(String::from("0")))
|
||||||
|
.and_then(|s| u32::from_str_radix(&s, 10).ok())
|
||||||
|
.and_then(|n| File::options().write(true).create(true).open(&path)
|
||||||
|
.and_then(|mut f | f.write((n + 1).to_string().as_bytes())).ok()
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[tokio::main]
|
||||||
|
async fn main() {
|
||||||
|
let args: Vec<_> = env::args().collect();
|
||||||
|
let default_dir = String::from(".");
|
||||||
|
let dir = args.get(1).unwrap_or(&default_dir);
|
||||||
|
let working_directory = PathBuf::from(dir);
|
||||||
|
|
||||||
|
File::open(working_directory.join("signatures.md")).expect("there isn't a guestbook (signatures.md) here... am I in the right place?");
|
||||||
|
|
||||||
|
let wd1 = working_directory.clone(); // FUCKED
|
||||||
|
let sign = warp::post().and(warp::path("sign"))
|
||||||
|
.and(warp::body::content_length_limit(1024)).and(warp::body::bytes())
|
||||||
|
.map(move |body: bytes::Bytes| {
|
||||||
|
if let Some(_) = sign(wd1.clone(), body) {
|
||||||
|
println!("successfully signed!");
|
||||||
|
warp::reply::with_status(warp::reply(), warp::http::StatusCode::ACCEPTED)
|
||||||
|
} else {
|
||||||
|
println!("failed to sign :(");
|
||||||
|
warp::reply::with_status(warp::reply(), warp::http::StatusCode::BAD_REQUEST)
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
let step = warp::post().and(warp::path("step")).and(warp::path::param())
|
||||||
|
.map(move |page: String| {
|
||||||
|
let path = working_directory.join("footsteps").join(&page);
|
||||||
|
|
||||||
|
if let Some(_) = step(path) {
|
||||||
|
println!("successfully stepped through {page}");
|
||||||
|
warp::reply::with_status(warp::reply(), warp::http::StatusCode::ACCEPTED)
|
||||||
|
} else {
|
||||||
|
println!("failed to step through {page} :(");
|
||||||
|
warp::reply::with_status(warp::reply(), warp::http::StatusCode::BAD_REQUEST)
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
let fail = warp::post().map(|| { println!("bad request"); format!("Invalid request. Try loam/sign or loam/step/<page>") } );
|
||||||
|
|
||||||
|
let routes = warp::path("loam").and(sign.or(step)).or(fail).with(warp::trace::request());
|
||||||
|
|
||||||
|
println!("starting...");
|
||||||
|
warp::serve(routes).run(([127, 0, 0, 1], 3030)).await
|
||||||
|
}
|
||||||
0
src/site.rs
Normal file
0
src/site.rs
Normal file
Loading…
Add table
Reference in a new issue