Add bookmarks to Contextswitch data

This commit is contained in:
2022-02-17 13:06:48 +01:00
parent 86a2649e45
commit 289c3959da
7 changed files with 118 additions and 46 deletions

View File

@@ -23,11 +23,11 @@ impl std::fmt::Debug for ContextswitchError {
#[derive(thiserror::Error)]
pub enum ContextswitchError {
#[error("Invalid Contextswitch metadata: {metadata}")]
InvalidMetadataError {
#[error("Invalid Contextswitch data: {data}")]
InvalidDataError {
#[source]
source: serde_json::Error,
metadata: String,
data: String,
},
#[error(transparent)]
UnexpectedError(#[from] anyhow::Error),
@@ -35,12 +35,12 @@ pub enum ContextswitchError {
#[tracing::instrument(level = "debug")]
pub fn list_tasks(filters: Vec<&str>) -> Result<Vec<Task>, ContextswitchError> {
let tasks: Result<Vec<Task>, ContextswitchError> = taskwarrior::list_tasks(filters)
let tasks: Vec<Task> = taskwarrior::list_tasks(filters)
.map_err(|e| ContextswitchError::UnexpectedError(e.into()))?
.iter()
.map(Task::try_from)
.map(Task::from)
.collect();
tasks
Ok(tasks)
}
#[tracing::instrument(level = "debug")]
@@ -48,5 +48,5 @@ pub async fn add_task(add_args: Vec<&str>) -> Result<Task, ContextswitchError> {
let taskwarrior_task = taskwarrior::add_task(add_args)
.await
.map_err(|e| ContextswitchError::UnexpectedError(e.into()))?;
(&taskwarrior_task).try_into()
Ok((&taskwarrior_task).into())
}

View File

@@ -1,8 +1,7 @@
use crate::contextswitch::ContextswitchError;
use anyhow::{anyhow, Context};
use chrono::{DateTime, Utc};
use configparser::ini::Ini;
use contextswitch_types::{ContextSwitchMetadata, Task, TaskId};
use contextswitch_types::{ContextswitchData, Task, TaskId};
use regex::Regex;
use serde::{Deserialize, Serialize};
use serde_json;
@@ -12,7 +11,7 @@ use std::path::Path;
use std::process::Command;
use std::str;
use tokio::sync::Mutex;
use tracing::debug;
use tracing::{debug, warn};
use uuid::Uuid;
#[derive(Debug, Serialize, Deserialize, PartialEq, Clone, Eq)]
@@ -88,27 +87,23 @@ pub struct TaskwarriorTask {
pub contextswitch: Option<String>,
}
impl TryFrom<&TaskwarriorTask> for Task {
type Error = ContextswitchError;
impl From<&TaskwarriorTask> for Task {
fn from(task: &TaskwarriorTask) -> Self {
let cs_data =
task.contextswitch
.as_ref()
.and_then(|cs_string| -> Option<ContextswitchData> {
let contextswitch_data_result = serde_json::from_str(cs_string);
if contextswitch_data_result.is_err() {
warn!(
"Invalid Contextswitch data found in {}: {}",
&task.uuid, cs_string
);
}
contextswitch_data_result.ok()
});
fn try_from(task: &TaskwarriorTask) -> Result<Self, Self::Error> {
let cs_metadata = task.contextswitch.as_ref().map_or(
Ok(None),
|cs_string| -> Result<Option<ContextSwitchMetadata>, ContextswitchError> {
if cs_string.is_empty() || cs_string == "{}" {
Ok(None)
} else {
Some(serde_json::from_str(cs_string))
.transpose()
.map_err(|e| ContextswitchError::InvalidMetadataError {
source: e,
metadata: cs_string.to_string(),
})
}
},
)?;
Ok(Task {
Task {
id: (&task.uuid).into(),
entry: task.entry,
modified: task.modified,
@@ -124,8 +119,8 @@ impl TryFrom<&TaskwarriorTask> for Task {
priority: task.priority,
recur: task.recur,
tags: task.tags.clone(),
contextswitch: cs_metadata,
})
contextswitch: cs_data,
}
}
}
@@ -150,7 +145,7 @@ fn write_default_config(data_location: &str) -> String {
taskrc.setstr(
"default",
"uda.contextswitch.label",
Some("Context Switch metadata"),
Some("Contextswitch data"),
);
taskrc.setstr("default", "uda.contextswitch.default", Some("{}"));

View File

@@ -12,7 +12,7 @@ pub struct TaskQuery {
impl ResponseError for contextswitch::ContextswitchError {
fn status_code(&self) -> StatusCode {
match self {
contextswitch::ContextswitchError::InvalidMetadataError { .. } => {
contextswitch::ContextswitchError::InvalidDataError { .. } => {
StatusCode::INTERNAL_SERVER_ERROR
}
contextswitch::ContextswitchError::UnexpectedError(_) => {