sentinel_core/core/base/
resource.rs

1//! Resource/Traffic Wrappers
2use crate::utils::format_time_nanos_curr;
3use serde::{Deserialize, Serialize};
4use std::fmt;
5
6/// ResourceType represents resource_type of the resources
7#[derive(Debug, Copy, Clone, PartialEq, Serialize, Deserialize)]
8#[repr(u8)]
9pub enum ResourceType {
10    Common = 0,
11    Web,
12    RPC,
13    APIGateway,
14    DBSQL,
15    Cache,
16    MQ,
17}
18
19impl Default for ResourceType {
20    fn default() -> ResourceType {
21        ResourceType::Common
22    }
23}
24
25// or use `num_enum` crate
26impl From<u8> for ResourceType {
27    fn from(num: u8) -> ResourceType {
28        match num {
29            1 => ResourceType::Web,
30            2 => ResourceType::RPC,
31            3 => ResourceType::APIGateway,
32            4 => ResourceType::DBSQL,
33            5 => ResourceType::Cache,
34            6 => ResourceType::MQ,
35            _ => ResourceType::Common,
36        }
37    }
38}
39
40/// TrafficType describes the traffic type: Inbound or Outbound
41#[derive(Debug, Copy, Clone, PartialEq)]
42pub enum TrafficType {
43    Outbound,
44    Inbound,
45}
46
47impl Default for TrafficType {
48    fn default() -> TrafficType {
49        TrafficType::Outbound
50    }
51}
52
53/// ResourceWrapper represents the invocation
54#[derive(Debug, Clone)]
55pub struct ResourceWrapper {
56    /// global unique resource name
57    name: String,
58    /// resource resource_type
59    resource_type: ResourceType,
60    /// Inbound or Outbound
61    traffic_type: TrafficType,
62}
63
64impl Default for ResourceWrapper {
65    fn default() -> Self {
66        ResourceWrapper {
67            name: format_time_nanos_curr(),
68            resource_type: ResourceType::default(),
69            traffic_type: TrafficType::default(),
70        }
71    }
72}
73
74impl fmt::Display for ResourceWrapper {
75    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
76        write!(
77            f,
78            "ResourceWrapper{{name={}, flowType={:?}, resource_type={:?}}}",
79            self.name, self.traffic_type, self.resource_type
80        )
81    }
82}
83
84impl ResourceWrapper {
85    pub fn new(name: String, resource_type: ResourceType, traffic_type: TrafficType) -> Self {
86        ResourceWrapper {
87            name,
88            resource_type,
89            traffic_type,
90        }
91    }
92    pub fn name(&self) -> &String {
93        &self.name
94    }
95
96    pub fn resource_type(&self) -> &ResourceType {
97        &self.resource_type
98    }
99    pub fn traffic_type(&self) -> &TrafficType {
100        &self.traffic_type
101    }
102}