Skip to main content

gobby_code/graph/code_graph/
connection.rs

1use 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}