objtalk 0.3.0

a lightweight realtime database for IoT projects
Documentation
use crate::json_rpc::*;
use crate::patterns::Pattern;
use crate::server::{Server, Client, Message};
use serde_json::Value;

fn handle_request(request: Request, request_id: Value, client: &Client, server: Server) -> Result<Option<Response>, String> {
	match request {
		Request::Set { name, value } => {
			server.set(&name, value, client)
				.map_err(|e| e.to_string())?;
			
			Ok(Some(Response::Success { success: true }))
		},
		Request::Patch { name, value } => {
			server.patch(&name, value, client)
				.map_err(|e| e.to_string())?;
			
			Ok(Some(Response::Success { success: true }))
		},
		Request::Get { pattern } => {
			let pattern = Pattern::compile(&pattern).map_err(|_| "invalid pattern".to_string())?;
			
			let objects = server.get(&pattern, client);
			Ok(Some(Response::Get { objects }))
		},
		Request::Query { pattern, provide_rpc } => {
			let pattern = Pattern::compile(&pattern).map_err(|_| "invalid pattern".to_string())?;
			
			let (query_id, objects) = server.query(&pattern, provide_rpc, client)
				.map_err(|e| e.to_string())?;
			
			Ok(Some(Response::Query { query_id, objects }))
		},
		Request::Unsubscribe { query_id } => {
			server.unsubscribe(query_id, client)
				.map_err(|e| e.to_string())?;
			
			Ok(Some(Response::Success { success: true }))
		},
		Request::Remove { name } => {
			let existed = server.remove(&name, client)
				.map_err(|e| e.to_string())?;
			
			Ok(Some(Response::Remove { existed }))
		},
		Request::Emit { object, event, data } => {
			server.emit(&object, &event, data, client)
				.map_err(|e| e.to_string())?;
			
			Ok(Some(Response::Success { success: true }))
		},
		Request::Invoke { object, method, args } => {
			server.invoke(&object, &method, args, request_id, client)
				.map_err(|e| e.to_string())?;
			
			Ok(None)
		},
		Request::InvokeResult { invocation_id, result } => {
			server.invoke_result(invocation_id, result, client)
				.map_err(|e| e.to_string())?;
			
			Ok(Some(Response::Success { success: true }))
		},
		Request::SetDisconnectCommands { commands } => {
			server.set_disconnect_commands(commands, client)
				.map_err(|e| e.to_string())?;
			
			Ok(Some(Response::Success { success: true }))
		},
	}
}

pub fn handle_message(req: RequestMessage, client: &Client, server: Server) -> Option<ResponseMessage> {
	match handle_request(req.request, req.id.clone(), client, server) {
		Ok(None) => None,
		Ok(Some(result)) => {
			Some(ResponseMessage {
				request_id: req.id,
				result: Some(result),
				error: None
			})
		},
		Err(e) => {
			Some(ResponseMessage {
				request_id: req.id,
				result: None,
				error: Some(e)
			})
		}
	}
}

pub fn handle_inbox_message(msg: Message) -> EventMessage {
	match msg {
		Message::QueryAdd { query_id, object } => EventMessage::QueryAdd { query_id, object },
		Message::QueryChange { query_id, object } => EventMessage::QueryChange { query_id, object },
		Message::QueryRemove { query_id, object } => EventMessage::QueryRemove { query_id, object },
		Message::QueryEvent { query_id, object, event, data } => EventMessage::QueryEvent { query_id, object, event, data },
		Message::QueryInvocation { query_id, invocation_id, object, method, args } => EventMessage::QueryInvocation { query_id, invocation_id, object, method, args },
		Message::InvocationResult { request_id, result: Ok(result) } => EventMessage::InvocationResult { request_id, result: Some(result), error: None },
		Message::InvocationResult { request_id, result: Err(error) } => EventMessage::InvocationResult { request_id, result: None, error: Some(error.to_string()) },
	}
}