This commit is contained in:
Bill Thiede 2023-07-15 16:58:15 -07:00
parent 458bd356dd
commit 39bef1ea87
3 changed files with 51 additions and 8 deletions

View File

@ -1,10 +1,12 @@
#[macro_use] #[macro_use]
extern crate rocket; extern crate rocket;
mod error;
mod nm;
use std::{error::Error, io::Cursor, str::FromStr}; use std::{error::Error, io::Cursor, str::FromStr};
use glog::Flags; use glog::Flags;
use notmuch::{Notmuch, NotmuchError, ThreadSet}; use notmuch::{Notmuch, NotmuchError};
use rocket::{ use rocket::{
http::{ContentType, Header}, http::{ContentType, Header},
request::Request, request::Request,
@ -14,6 +16,8 @@ use rocket::{
}; };
use rocket_cors::{AllowedHeaders, AllowedOrigins}; use rocket_cors::{AllowedHeaders, AllowedOrigins};
use crate::error::ServerError;
#[get("/")] #[get("/")]
fn hello() -> &'static str { fn hello() -> &'static str {
"Hello, world!" "Hello, world!"
@ -52,8 +56,11 @@ async fn search(
} }
#[get("/show/<query>")] #[get("/show/<query>")]
async fn show(nm: &State<Notmuch>, query: &str) -> Result<Json<ThreadSet>, Debug<NotmuchError>> { async fn show(
let res = nm.show(query)?; nm: &State<Notmuch>,
query: &str,
) -> Result<Json<Vec<shared::Message>>, Debug<ServerError>> {
let res = nm::threadset_to_messages(nm.show(query).map_err(|e| -> ServerError { e.into() })?)?;
Ok(Json(res)) Ok(Json(res))
} }

View File

@ -15,5 +15,21 @@ pub struct ShowResult {
messages: Vec<Message>, messages: Vec<Message>,
} }
#[derive(Serialize, Deserialize, Debug)] pub type AttachementId = String;
pub enum Message {}
/// # Number of seconds since the Epoch
pub type UnixTime = isize;
#[derive(Serialize, Deserialize, Debug, Default)]
pub struct Message {
pub from: String,
pub to: Option<String>,
pub cc: Option<String>,
pub timestamp: UnixTime, // date header as unix time
pub date_relative: String, // user-friendly timestamp
pub tags: Vec<String>,
// HTML formatted body
pub body: String,
pub attachment: Vec<AttachementId>,
}

View File

@ -8,9 +8,9 @@ use std::{
use itertools::Itertools; use itertools::Itertools;
use log::{debug, error, info, Level}; use log::{debug, error, info, Level};
use nm::{show_request, view_thread};
use notmuch::ThreadSet; use notmuch::ThreadSet;
use seed::{prelude::*, *}; use seed::{prelude::*, *};
use serde::Deserialize;
use wasm_timer::Instant; use wasm_timer::Instant;
const SEARCH_RESULTS_PER_PAGE: usize = 20; const SEARCH_RESULTS_PER_PAGE: usize = 20;
@ -93,7 +93,7 @@ mod urls {
enum Context { enum Context {
None, None,
Search(shared::SearchResult), Search(shared::SearchResult),
Thread(ThreadSet), Thread(Vec<shared::Message>),
} }
// `Model` describes our app state. // `Model` describes our app state.
@ -127,7 +127,7 @@ pub enum Msg {
}, },
SearchResult(fetch::Result<shared::SearchResult>), SearchResult(fetch::Result<shared::SearchResult>),
ShowRequest(String), ShowRequest(String),
ShowResult(fetch::Result<ThreadSet>), ShowResult(fetch::Result<Vec<shared::Message>>),
NextPage, NextPage,
PreviousPage, PreviousPage,
} }
@ -210,6 +210,19 @@ fn update(msg: Msg, model: &mut Model, orders: &mut impl Orders<Msg>) {
} }
} }
pub async fn show_request(tid: &str) -> fetch::Result<Vec<shared::Message>> {
let b = Request::new(api::show(tid))
.method(Method::Get)
.fetch()
.await?
.check_status()?
.bytes()
.await?;
let mut deserializer = serde_json::Deserializer::from_slice(&b);
deserializer.disable_recursion_limit();
Ok(Vec::<shared::Message>::deserialize(&mut deserializer)
.map_err(|_| FetchError::JsonError(fetch::JsonError::Serde(JsValue::NULL)))?)
}
async fn search_request( async fn search_request(
query: &str, query: &str,
page: usize, page: usize,
@ -496,6 +509,13 @@ fn view_footer(render_time_ms: u128) -> Node<Msg> {
] ]
} }
fn view_thread(messages: &[shared::Message]) -> Node<Msg> {
div![
"MESSAGES GO HERE",
ol![messages.iter().map(|msg| li![format!("{:?}", msg)])]
]
}
fn view_desktop(model: &Model) -> Node<Msg> { fn view_desktop(model: &Model) -> Node<Msg> {
let content = match &model.context { let content = match &model.context {
Context::None => div![h1!["Loading"]], Context::None => div![h1!["Loading"]],