WIP
This commit is contained in:
parent
458bd356dd
commit
39bef1ea87
@ -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))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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>,
|
||||||
|
}
|
||||||
|
|||||||
@ -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"]],
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user