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