From 15a130cc3df9598922d6faea50b520c03d75c5a2 Mon Sep 17 00:00:00 2001 From: Xe Date: Mon, 20 Jun 2022 12:47:11 +0000 Subject: job history: even more Signed-off-by: Xe --- src/app/config.rs | 178 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/app/mod.rs | 66 +------------------- 2 files changed, 181 insertions(+), 63 deletions(-) create mode 100644 src/app/config.rs (limited to 'src') 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, + pub authors: Vec, + pub port: u16, + #[serde(rename = "clackSet")] + pub clack_set: Vec, + #[serde(rename = "resumeFname")] + pub resume_fname: PathBuf, + #[serde(rename = "miToken")] + pub mi_token: String, + #[serde(rename = "jobHistory")] + pub job_history: Vec, +} + +#[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, + pub link: Option, + pub twitter: Option, + 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, +} + +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, + #[serde(rename = "daysWorked")] + pub days_worked: Option, + #[serde(rename = "daysBetween")] + pub days_between: Option, + pub salary: Salary, + #[serde(rename = "leaveReason")] + pub leave_reason: Option, + pub locations: Vec, + pub highlights: Vec, + #[serde(rename = "hideFromResume")] + pub hide_from_resume: bool, +} + +#[derive(Clone, Deserialize, Serialize, Default)] +pub struct Company { + pub name: String, + pub url: Option, + 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, - #[serde(rename = "resumeFname")] - pub(crate) resume_fname: PathBuf, - #[serde(rename = "miToken")] - pub(crate) mi_token: String, - #[serde(rename = "jobHistory")] - pub(crate) job_history: Vec, -} - -#[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, - #[serde(rename = "daysWorked")] - pub days_worked: Option, - #[serde(rename = "daysBetween")] - pub days_between: Option, - pub salary: Salary, - #[serde(rename = "leaveReason")] - pub leave_reason: Option, -} - -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> { -- cgit v1.2.3