Skip to main content

impactsense_parser/
edge.rs

1use std::fmt;
2
3/// Relationship types used in the Neo4j graph.
4///
5/// Keeping these in one place avoids hard‑coding relationship names in
6/// multiple modules and makes the schema easier to evolve.
7#[derive(Debug, Clone, Copy, PartialEq, Eq)]
8pub enum RelType {
9    /// File -> Module: file declares a module.
10    DeclaresModule,
11    /// File/Module -> Function: parent declares a function.
12    DeclaresFunction,
13    /// File -> Class: file declares a class.
14    DeclaresClass,
15    /// Class -> Property: type declares a property (C#; CRM-3587).
16    DeclaresProperty,
17    /// File -> File: one file depends (imports/includes) on another.
18    DependsOnFile,
19    /// Function -> Function: call graph edge.
20    CallsFunction,
21    /// ApiEndpoint -> Function: which function handles this API.
22    HandlesApi,
23    /// Function -> ExternalApi: function calls an external service/API.
24    CallsExternalApi,
25    /// ApiEndpoint -> ExternalApi: same API exposed and called.
26    SameApi,
27    /// Function -> Class: function uses this class/type.
28    UsesClass,
29    /// Class -> Class: class uses another class (inheritance, composition).
30    ClassUsesClass,
31    /// Module -> Behaviour: module implements behaviour contract.
32    ImplementsBehaviour,
33    /// Behaviour -> Callback: behaviour declares callback contract.
34    DeclaresCallback,
35    /// Function -> Callback: function implements callback contract.
36    ImplementsCallback,
37    /// File -> Behaviour: file declares a custom behaviour.
38    DeclaresBehaviour,
39    /// Behaviour -> Behaviour: behaviour extends another behaviour.
40    ExtendsBehaviour,
41    /// Function -> Callback: function explicitly overrides callback contract.
42    OverridesCallback,
43}
44
45impl fmt::Display for RelType {
46    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
47        let s = match self {
48            RelType::DeclaresModule => "DECLARES_MODULE",
49            RelType::DeclaresFunction => "DECLARES_FUNCTION",
50            RelType::DeclaresClass => "DECLARES_CLASS",
51            RelType::DeclaresProperty => "DECLARES_PROPERTY",
52            RelType::DependsOnFile => "DEPENDS_ON_FILE",
53            RelType::CallsFunction => "CALLS_FUNCTION",
54            RelType::HandlesApi => "HANDLED_BY",
55            RelType::CallsExternalApi => "CALLS_EXTERNAL_API",
56            RelType::SameApi => "SAME_API",
57            RelType::UsesClass => "USES_CLASS",
58            RelType::ClassUsesClass => "USES_CLASS",
59            RelType::ImplementsBehaviour => "IMPLEMENTS_BEHAVIOUR",
60            RelType::DeclaresCallback => "DECLARES_CALLBACK",
61            RelType::ImplementsCallback => "IMPLEMENTS_CALLBACK",
62            RelType::DeclaresBehaviour => "DECLARES_BEHAVIOUR",
63            RelType::ExtendsBehaviour => "EXTENDS_BEHAVIOUR",
64            RelType::OverridesCallback => "OVERRIDES_CALLBACK",
65        };
66        f.write_str(s)
67    }
68}
69
70