use std::collections::BTreeMap;
use onetaskgraph_plugin_api::{
Capabilities, Direction, Document, DocumentQuery, ItemWrite, NativeId, PageRequest, Project,
ProjectQuery, SourceError, Task, TaskQuery, WriteSupport,
};
use serde::{Deserialize, Serialize};
use serde_json::Value;
pub(crate) const PROTOCOL_VERSION: u32 = 2;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub(crate) struct Request {
pub(crate) id: String,
pub(crate) method: String,
pub(crate) params: Value,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub(crate) struct Response {
pub(crate) id: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub(crate) result: Option<Value>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub(crate) error: Option<SourceError>,
}
impl Response {
pub(crate) fn ok(id: String, result: Value) -> Self {
Self {
id,
result: Some(result),
error: None,
}
}
pub(crate) fn failed(id: String, error: SourceError) -> Self {
Self {
id,
result: None,
error: Some(error),
}
}
pub(crate) fn outcome(self) -> Option<Result<Value, SourceError>> {
match (self.result, self.error) {
(Some(result), None) => Some(Ok(result)),
(None, Some(error)) => Some(Err(error)),
_ => None,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub(crate) struct InitializeParams {
pub(crate) protocol_version: u32,
pub(crate) engine: EngineIdentity,
pub(crate) source_name: String,
pub(crate) config: Value,
pub(crate) secrets: BTreeMap<String, String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub(crate) struct EngineIdentity {
pub(crate) name: String,
pub(crate) version: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub(crate) struct InitializeResult {
#[serde(default)]
pub(crate) protocol_version: Option<u32>,
pub(crate) kind: HandshakePluginKind,
pub(crate) capabilities: Capabilities,
#[serde(default)]
pub(crate) writes: Option<WriteSupport>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(try_from = "String", into = "String")]
pub(crate) struct HandshakePluginKind(String);
impl HandshakePluginKind {
pub(crate) fn new(kind: impl Into<String>) -> Result<Self, &'static str> {
let kind = kind.into();
if kind.trim().is_empty() {
Err("plugin kind must contain a non-whitespace character")
} else {
Ok(Self(kind))
}
}
pub(crate) fn into_string(self) -> String {
self.0
}
}
impl TryFrom<String> for HandshakePluginKind {
type Error = &'static str;
fn try_from(kind: String) -> Result<Self, Self::Error> {
Self::new(kind)
}
}
impl From<HandshakePluginKind> for String {
fn from(kind: HandshakePluginKind) -> Self {
kind.0
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub(crate) struct IdParams {
pub(crate) id: NativeId,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub(crate) struct TaskResult {
#[serde(default)]
pub(crate) task: Option<Task>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub(crate) struct ProjectResult {
#[serde(default)]
pub(crate) project: Option<Project>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub(crate) struct DocumentResult {
#[serde(default)]
pub(crate) document: Option<Document>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub(crate) struct TaskQueryParams {
pub(crate) query: TaskQuery,
pub(crate) page: PageRequest,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub(crate) struct ProjectQueryParams {
pub(crate) query: ProjectQuery,
pub(crate) page: PageRequest,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub(crate) struct LabelParams {
pub(crate) page: PageRequest,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub(crate) struct DocumentQueryParams {
pub(crate) query: DocumentQuery,
pub(crate) page: PageRequest,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub(crate) struct DependencyParams {
pub(crate) id: NativeId,
pub(crate) direction: Direction,
pub(crate) page: PageRequest,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub(crate) struct TaskWriteParams {
pub(crate) write: ItemWrite<Task>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub(crate) struct ProjectWriteParams {
pub(crate) write: ItemWrite<Project>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub(crate) struct DocumentWriteParams {
pub(crate) write: ItemWrite<Document>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub(crate) struct DeleteParams {
pub(crate) id: NativeId,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub(crate) struct WriteResult {
pub(crate) id: NativeId,
}