diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/app/config.rs | 178 | ||||
| -rw-r--r-- | src/app/mod.rs | 66 |
2 files changed, 181 insertions, 63 deletions
diff --git a/src/app/config.rs b/src/app/config.rs new file mode 100644 index 0000000..537e291 --- /dev/null +++ b/src/app/config.rs @@ -0,0 +1,178 @@ +use crate::signalboost::Person; +use maud::{html, Markup}; +use serde::{Deserialize, Serialize}; +use std::{ + fmt::{self, Display}, + path::PathBuf, +}; + +#[derive(Clone, Deserialize, Default)] +pub struct Config { + pub signalboost: Vec<Person>, + pub authors: Vec<Author>, + pub port: u16, + #[serde(rename = "clackSet")] + pub clack_set: Vec<String>, + #[serde(rename = "resumeFname")] + pub resume_fname: PathBuf, + #[serde(rename = "miToken")] + pub mi_token: String, + #[serde(rename = "jobHistory")] + pub job_history: Vec<Job>, +} + +#[derive(Clone, Deserialize, Serialize)] +pub enum StockKind { + Grant, + Options, +} + +impl Default for StockKind { + fn default() -> Self { + StockKind::Options + } +} + +#[derive(Clone, Deserialize, Serialize, Default)] +pub struct Author { + pub name: String, + pub handle: String, + #[serde(rename = "picUrl")] + pub pic_url: Option<String>, + pub link: Option<String>, + pub twitter: Option<String>, + pub default: bool, + #[serde(rename = "inSystem")] + pub in_system: bool, +} + +#[derive(Clone, Deserialize, Serialize, Default)] +pub struct Stock { + pub amount: i32, + #[serde(rename = "cliffYears")] + pub cliff_years: i32, + pub kind: StockKind, + pub liquid: bool, + #[serde(rename = "vestingYears")] + pub vesting_years: i32, +} + +#[derive(Clone, Deserialize, Serialize, Default)] +pub struct Location { + pub city: String, + #[serde(rename = "stateOrProvince")] + pub state_or_province: String, + pub country: String, + pub remote: bool, +} + +#[derive(Clone, Deserialize, Serialize, Default)] +pub struct Salary { + pub amount: i32, + pub per: String, + pub currency: String, + pub stock: Option<Stock>, +} + +impl Display for Salary { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "{}${}/{}", self.currency, self.amount, self.per) + } +} + +impl Salary { + pub fn html(&self) -> Markup { + if self.stock.is_none() { + return html! { (self) }; + } + + let stock = self.stock.as_ref().unwrap(); + html! { + details { + summary { + (self) + } + + p{ + (stock.amount) + " " + @if stock.liquid { + "liquid" + } + " " + @match stock.kind { + StockKind::Options => { + "options" + }, + StockKind::Grant => { + "granted shares" + } + } + ". Vesting for " + (stock.vesting_years) + " " + @if stock.vesting_years == 1 { + "year" + } @else { + "years" + } + " " + " with a cliff of " + (stock.cliff_years) + " " + @if stock.cliff_years == 1 { + "year" + } @else { + "years" + } + "." + } + } + } + } +} + +#[derive(Clone, Deserialize, Serialize, Default)] +pub struct Job { + pub company: Company, + pub title: String, + #[serde(rename = "startDate")] + pub start_date: String, + #[serde(rename = "endDate")] + pub end_date: Option<String>, + #[serde(rename = "daysWorked")] + pub days_worked: Option<i32>, + #[serde(rename = "daysBetween")] + pub days_between: Option<i32>, + pub salary: Salary, + #[serde(rename = "leaveReason")] + pub leave_reason: Option<String>, + pub locations: Vec<Location>, + pub highlights: Vec<String>, + #[serde(rename = "hideFromResume")] + pub hide_from_resume: bool, +} + +#[derive(Clone, Deserialize, Serialize, Default)] +pub struct Company { + pub name: String, + pub url: Option<String>, + pub tagline: String, + pub location: Location, + pub defunct: bool, +} + +impl Job { + pub fn pay_history_row(&self) -> Markup { + html! { + tr { + td { (self.title) } + td { (self.start_date) } + td { (self.end_date.as_ref().unwrap_or(&"current".to_string())) } + td { (if self.days_worked.is_some() { self.days_worked.as_ref().unwrap().to_string() } else { "n/a".to_string() }) } + td { (self.salary.html()) } + td { (self.leave_reason.as_ref().unwrap_or(&"n/a".to_string())) } + } + } + } +} diff --git a/src/app/mod.rs b/src/app/mod.rs index a12d1c6..e938f36 100644 --- a/src/app/mod.rs +++ b/src/app/mod.rs @@ -1,74 +1,14 @@ use crate::{post::Post, signalboost::Person}; use chrono::prelude::*; use color_eyre::eyre::Result; -use maud::{html, Markup}; -use serde::{Deserialize, Serialize}; -use std::{ - fmt::{self, Display}, - fs, - path::PathBuf, - sync::Arc, -}; +use std::{fs, path::PathBuf, sync::Arc}; use tracing::{error, instrument}; +pub mod config; pub mod markdown; pub mod poke; -#[derive(Clone, Deserialize, Default)] -pub struct Config { - pub(crate) signalboost: Vec<Person>, - #[serde(rename = "resumeFname")] - pub(crate) resume_fname: PathBuf, - #[serde(rename = "miToken")] - pub(crate) mi_token: String, - #[serde(rename = "jobHistory")] - pub(crate) job_history: Vec<Job>, -} - -#[derive(Clone, Deserialize, Serialize, Default)] -pub struct Salary { - pub amount: i32, - pub per: String, - pub currency: String, -} - -impl Display for Salary { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "{}${}/{}", self.currency, self.amount, self.per) - } -} - -#[derive(Clone, Deserialize, Serialize, Default)] -pub struct Job { - pub company: String, - pub title: String, - #[serde(rename = "startDate")] - pub start_date: String, - #[serde(rename = "endDate")] - pub end_date: Option<String>, - #[serde(rename = "daysWorked")] - pub days_worked: Option<i32>, - #[serde(rename = "daysBetween")] - pub days_between: Option<i32>, - pub salary: Salary, - #[serde(rename = "leaveReason")] - pub leave_reason: Option<String>, -} - -impl Job { - pub fn pay_history_row(&self) -> Markup { - html! { - tr { - td { (self.title) } - td { (self.start_date) } - td { (self.end_date.as_ref().unwrap_or(&"current".to_string())) } - td { (if self.days_worked.is_some() { self.days_worked.as_ref().unwrap().to_string() } else { "n/a".to_string() }) } - td { (self.salary) } - td { (self.leave_reason.as_ref().unwrap_or(&"n/a".to_string())) } - } - } - } -} +pub use config::*; #[instrument] async fn patrons() -> Result<Option<patreon::Users>> { |
