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

View File

@ -15,5 +15,21 @@ pub struct ShowResult {
messages: Vec<Message>,
}
#[derive(Serialize, Deserialize, Debug)]
pub enum Message {}
pub type AttachementId = String;
/// # 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 log::{debug, error, info, Level};
use nm::{show_request, view_thread};
use notmuch::ThreadSet;
use seed::{prelude::*, *};
use serde::Deserialize;
use wasm_timer::Instant;
const SEARCH_RESULTS_PER_PAGE: usize = 20;
@ -93,7 +93,7 @@ mod urls {
enum Context {
None,
Search(shared::SearchResult),
Thread(ThreadSet),
Thread(Vec<shared::Message>),
}
// `Model` describes our app state.
@ -127,7 +127,7 @@ pub enum Msg {
},
SearchResult(fetch::Result<shared::SearchResult>),
ShowRequest(String),
ShowResult(fetch::Result<ThreadSet>),
ShowResult(fetch::Result<Vec<shared::Message>>),
NextPage,
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(
query: &str,
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> {
let content = match &model.context {
Context::None => div![h1!["Loading"]],