use hyperlog_protos::hyperlog::{ graph_server::{Graph, GraphServer}, *, }; use std::{collections::HashMap, net::SocketAddr}; use tonic::{transport, Response}; use crate::{ querier::{Querier, QuerierExt}, state::SharedState, }; #[allow(dead_code)] pub struct Server { querier: Querier, } impl Server { pub fn new(querier: Querier) -> Self { Self { querier } } } #[tonic::async_trait] impl Graph for Server { async fn get( &self, request: tonic::Request, ) -> std::result::Result, tonic::Status> { let msg = request.get_ref(); tracing::trace!("get: req({:?})", msg); Ok(Response::new(GetReply { item: Some(GraphItem { path: "kjuulh".into(), contents: Some(graph_item::Contents::User(UserGraphItem { items: HashMap::from([( "some".to_string(), GraphItem { path: "some".into(), contents: Some(graph_item::Contents::Item(ItemGraphItem { title: "some-title".into(), description: "some-description".into(), item_state: Some(item_graph_item::ItemState::NotDone( ItemStateNotDone {}, )), })), }, )]), })), }), })) } async fn get_available_roots( &self, request: tonic::Request, ) -> std::result::Result, tonic::Status> { let req = request.into_inner(); tracing::trace!("get available roots: req({:?})", req); Ok(Response::new(GetAvailableRootsResponse { roots: vec!["kjuulh".into()], })) } async fn create_section( &self, request: tonic::Request, ) -> std::result::Result, tonic::Status> { let req = request.into_inner(); tracing::trace!("create section: req({:?})", req); Ok(Response::new(CreateSectionResponse {})) } } pub trait ServerExt { fn grpc_server(&self) -> Server; } impl ServerExt for SharedState { fn grpc_server(&self) -> Server { Server::new(self.querier()) } } pub async fn serve(state: &SharedState, host: SocketAddr) -> anyhow::Result<()> { tracing::info!("listening on {}", host); let graph_server = state.grpc_server(); transport::Server::builder() .add_service(GraphServer::new(graph_server)) .serve(host) .await?; Ok(()) }