gobby_code/graph/code_graph/
connection.rs1use crate::config::Context;
2use gobby_core::degradation::ServiceState;
3use gobby_core::falkor::GraphClient;
4
5use super::GraphReadError;
6
7pub fn require_graph_reads(ctx: &Context) -> anyhow::Result<()> {
8 if ctx.falkordb.is_none() {
9 return Err(GraphReadError::NotConfigured.into());
10 }
11 Ok(())
12}
13
14pub(super) fn with_required_core_graph<T>(
15 ctx: &Context,
16 f: impl FnOnce(&mut GraphClient) -> anyhow::Result<T>,
17) -> anyhow::Result<T> {
18 let config = ctx.falkordb.as_ref().ok_or(GraphReadError::NotConfigured)?;
19 let connection_config = config.connection_config();
20 match gobby_core::falkor::with_graph(
21 Some(&connection_config),
22 &config.graph_name,
23 None,
24 |client| f(client).map(Some),
25 ) {
26 Ok((Some(value), ServiceState::Available)) => Ok(value),
27 Ok((_, ServiceState::NotConfigured)) => Err(GraphReadError::NotConfigured.into()),
28 Ok((_, ServiceState::Unreachable { message })) => {
29 Err(GraphReadError::Unreachable { message }.into())
30 }
31 Ok((None, ServiceState::Available)) => Err(GraphReadError::QueryFailed {
32 message: "graph read returned no value".to_string(),
33 }
34 .into()),
35 Err(error) => Err(GraphReadError::QueryFailed {
36 message: error.to_string(),
37 }
38 .into()),
39 }
40}
41
42pub(super) fn with_optional_core_graph<T>(
43 ctx: &Context,
44 default: impl FnOnce() -> T,
45 f: impl FnOnce(&mut GraphClient) -> anyhow::Result<T>,
46) -> anyhow::Result<T> {
47 let Some(config) = ctx.falkordb.as_ref() else {
48 return Ok(default());
49 };
50 let connection_config = config.connection_config();
51 match gobby_core::falkor::with_graph(
52 Some(&connection_config),
53 &config.graph_name,
54 None,
55 |client| f(client).map(Some),
56 ) {
57 Ok((Some(value), ServiceState::Available)) => Ok(value),
58 Ok((_, ServiceState::NotConfigured | ServiceState::Unreachable { .. })) => Ok(default()),
59 Ok((None, ServiceState::Available)) => Err(GraphReadError::QueryFailed {
60 message: "graph read returned no value".to_string(),
61 }
62 .into()),
63 Err(error) => Err(GraphReadError::QueryFailed {
64 message: error.to_string(),
65 }
66 .into()),
67 }
68}