diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/lib.rs | 2 | ||||
-rw-r--r-- | src/model.rs | 76 | ||||
-rw-r--r-- | src/pdfgen.rs | 5 | ||||
-rw-r--r-- | src/validation.rs | 37 | ||||
-rw-r--r-- | src/view.rs | 72 |
5 files changed, 17 insertions, 175 deletions
@@ -1,4 +1,2 @@ mod view; -mod model; -mod validation; mod pdfgen;
\ No newline at end of file diff --git a/src/model.rs b/src/model.rs deleted file mode 100644 index cac0820..0000000 --- a/src/model.rs +++ /dev/null @@ -1,76 +0,0 @@ -use chrono::NaiveDateTime; -use crate::validation::{self, *}; - -pub struct BCard { - name: Option<Name>, - nickname: Option<String>, - label: Option<TypedProperty<String>>, - address: Option<TypedProperty<Address>>, - emails: Option<Vec<TypedProperty<String>>>, - title: Option<String>, - role: Option<String>, - organization: Option<String>, - urls: Option<Vec<TypedProperty<String>>>, - telephones: Option<Vec<TypedProperty<String>>>, - revision: Option<NaiveDateTime>, -} - -impl BCard { - fn new() -> Self { - Self { - name: None, - nickname: None, - label: None, - address: None, - emails: None, - title: None, - role: None, - organization: None, - urls: None, - telephones: None, - revision: None, - } - } -} - -impl Validation for BCard { - fn validate(&self) -> Result<(), ValidationError> { - let mut result = Ok(()); - result = match &self.name { - Some(n) => validation::add_results(result, n.validate()), - None => Err( ValidationError{ messages: vec![String::from("Name cannot be empty")] } ), - }; - // TODO add some more validation - result - } -} - -pub struct Name { - prefix: Option<String>, - first_name: Option<String>, - middle_name: Option<String>, - family_name: Option<String>, - suffix: Option<String>, -} - -impl Validation for Name { - fn validate(&self) -> std::result::Result<(), ValidationError> { todo!() } -} - -pub enum WorkHomeType { - Home, - Work, -} - -pub struct TypedProperty<T> { - p_type: Option<WorkHomeType>, - value: T, -} - -pub struct Address { - street: Option<String>, - city: Option<String>, - locality: Option<String>, - postal_code: Option<String>, - country: Option<String>, -}
\ No newline at end of file diff --git a/src/pdfgen.rs b/src/pdfgen.rs index b8c7f7d..410bb99 100644 --- a/src/pdfgen.rs +++ b/src/pdfgen.rs @@ -1,8 +1,7 @@ use genpdf::Element as _; use genpdf::{elements, style, fonts}; -use crate::model::BCard; -pub fn genpdf(bcard: BCard) -> Vec<u8> { +pub fn genpdf() -> Vec<u8> { let regular_bytes = include_bytes!("../fonts/fira-sans.regular.ttf"); let regular_font_data = fonts::FontData::new(regular_bytes.to_vec(), None).expect("font data should be correct"); @@ -43,6 +42,6 @@ pub fn genpdf(bcard: BCard) -> Vec<u8> { // TODO fill doc with real data let mut buf: Vec<u8> = Vec::new(); - doc.render(&mut buf); + doc.render(&mut buf).expect("should render pdf"); buf }
\ No newline at end of file diff --git a/src/validation.rs b/src/validation.rs deleted file mode 100644 index 715b472..0000000 --- a/src/validation.rs +++ /dev/null @@ -1,37 +0,0 @@ - - -pub trait Validation { - fn validate(&self) -> Result<(), ValidationError>; -} - -#[derive(Debug)] -pub struct ValidationError { - messages: Vec<String>, -} - -impl std::fmt::Display for ValidationError { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - for msg in &self.messages { - write!(f, "{}\n", msg)?; - } - Ok(()) - } -} - -impl std::error::Error for ValidationError { } - -pub fn add_results(first: Result<(), ValidationError>, second: Result<(), ValidationError>) -> Result<(), ValidationError> { - if first.is_ok() && second.is_ok() { - Ok(()) - } else if first.is_ok() && second.is_err() { - second - } else if first.is_err() && second.is_ok() { - first - } else { - let mut first = first.err().unwrap(); - let mut second = second.err().unwrap(); - first.messages.append(&mut second.messages); - - Err( ValidationError{ messages: first.messages } ) - } -}
\ No newline at end of file diff --git a/src/view.rs b/src/view.rs index 81634ed..9b95691 100644 --- a/src/view.rs +++ b/src/view.rs @@ -1,83 +1,41 @@ -use crate::model::BCard; +use crate::pdfgen; use wasm_bindgen::prelude::*; +use js_sys; use yew::prelude::*; struct Form { - link: ComponentLink<Self>, - bcard: BCard, } -impl Component for Form { // probably not necessary but who knows +impl Component for Form { type Message = (); type Properties = (); - fn create(_: Self::Properties, link: ComponentLink<Self>) -> Self { - Self { link } + fn create(_props: Self::Properties, _link: ComponentLink<Self>) -> Self { + Self { } } - fn update(&mut self, _: Self::Message) -> ShouldRender { + fn update(&mut self, _msg: Self::Message) -> ShouldRender { false } - fn change(&mut self, _: Self::Properties) -> ShouldRender { - false - } - - fn view(&self) -> Html { - html! { - <BCardForm/> - } - } -} - -// example - -struct Model { - link: ComponentLink<Self>, - value: i64, -} - -enum Msg { - AddOne, - Input(BCard), -} - -impl Component for Model { - type Message = Msg; - type Properties = (); - - fn create(_: Self::Properties, link: ComponentLink<Self>) -> Self { - Self { - link, - value: 0, - } - } - - fn update(&mut self, msg: Self::Message) -> ShouldRender { - match msg { - Msg::AddOne => self.value += 1 - } - true - } - fn change(&mut self, _props: Self::Properties) -> ShouldRender { - // Should only return "true" if new properties are different to - // previously received properties. - // This component has no properties so we will always return "false". false } fn view(&self) -> Html { - html! { - <div> - <button onclick=self.link.callback(|_| Msg::AddOne)>{ "+1" }</button> - <p>{ self.value }</p> - </div> + let pdf_raw = /*include_bytes!("../demo.pdf"); // this works */pdfgen::genpdf(); // this doesn't work + let pdf = std::str::from_utf8(&pdf_raw).expect("should be able to convert to string"); + let uri_component: String = js_sys::encode_uri_component(pdf).into(); + let href = format!{"data:application/pdf;charset=utf-8,{}", uri_component }; + html!{ + <a href=href download="demo.pdf" > + { "Download PDF" } + </a> } } } #[wasm_bindgen(start)] pub fn run_app() { - App::<Model>::new().mount_to_body(); + App::<Form>::new().mount_to_body(); }
\ No newline at end of file |