Skip to content

Commit ecf0aba

Browse files
authored
Feature/service custom settings (#13)
* feat: support for services custom definitions - Adding support for services to use the definitions file for custom settings. * chore: update repo ignore rules * refactor: remove duplicated code * chore: update repo README file
1 parent 3333ddc commit ecf0aba

File tree

4 files changed

+64
-18
lines changed

4 files changed

+64
-18
lines changed

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,3 +20,6 @@ Cargo.lock
2020
/Cargo.lock
2121
.stfolder
2222

23+
# misc files
24+
.DS_Store
25+

README.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,6 @@ using service definitions.
134134
* Enable features and services to use the same env system that the core uses.
135135
* Improve unit tests.
136136
* Full compatibility between go and rust gRPC services.
137-
* Allow using the service definitions file for custom service definitions.
138137

139138
## License
140139

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
name = "my-service"
2+
types = ["grpc"]
3+
version = "v1.0.0"
4+
language = "rust"
5+
product = "incredible-product"
6+
7+
[service]
8+
direction = "forward"
9+
ipc_port = 9991

src/definition/mod.rs

Lines changed: 52 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ use std::collections::HashMap;
66
use std::fmt::{Display, Formatter};
77
use std::sync::Arc;
88
use std::str::FromStr;
9-
109
use serde::de::DeserializeOwned;
1110
use validator::{ValidateArgs};
1211

@@ -28,6 +27,7 @@ pub struct Definitions {
2827
features: Option<HashMap<String, serde_json::Value>>,
2928
services: Option<HashMap<String, serde_json::Value>>,
3029
clients: Option<HashMap<String, Client>>,
30+
service: Option<serde_json::Value>,
3131

3232
#[serde(deserialize_with = "service::deserialize_services")]
3333
pub types: Vec<service::Service>,
@@ -138,14 +138,7 @@ impl Definitions {
138138
where
139139
T: DeserializeOwned,
140140
{
141-
if let Some(d) = self.feature(feature) {
142-
return match serde_json::from_value::<T>(d.clone()) {
143-
Err(e) => Err(merrors::Error::DefinitionLoadingFailure(feature.to_string(), e.to_string())),
144-
Ok(defs) => Ok(Some(defs)),
145-
}
146-
}
147-
148-
Ok(None)
141+
self.decode(self.feature(feature), feature)
149142
}
150143

151144
fn feature(&self, feature: &str) -> Option<serde_json::Value> {
@@ -159,14 +152,7 @@ impl Definitions {
159152
where
160153
T: DeserializeOwned,
161154
{
162-
if let Some(d) = self.service(&service_kind) {
163-
return match serde_json::from_value::<T>(d.clone()) {
164-
Err(e) => Err(merrors::Error::DefinitionLoadingFailure(service_kind.to_string(), e.to_string())),
165-
Ok(defs) => Ok(Some(defs)),
166-
}
167-
}
168-
169-
Ok(None)
155+
self.decode(self.service(&service_kind), &service_kind.to_string())
170156
}
171157

172158
fn service(&self, service_kind: &ServiceKind) -> Option<serde_json::Value> {
@@ -176,9 +162,36 @@ impl Definitions {
176162
}
177163
}
178164

165+
fn decode<T>(&self, data: Option<serde_json::Value>, name: &str) -> merrors::Result<Option<T>>
166+
where
167+
T: DeserializeOwned,
168+
{
169+
if let Some(d) = data {
170+
return match serde_json::from_value::<T>(d.clone()) {
171+
Ok(defs) => Ok(Some(defs)),
172+
Err(e) => Err(merrors::Error::DefinitionLoadingFailure(name.to_string(), e.to_string())),
173+
}
174+
}
175+
176+
Ok(None)
177+
}
178+
179179
pub fn client(&self, name: &str) -> Option<Client> {
180180
self.clients.clone()?.get(name).cloned()
181181
}
182+
183+
pub fn custom_settings<T>(&self) -> merrors::Result<Option<T>>
184+
where
185+
T: DeserializeOwned,
186+
{
187+
match &self.service {
188+
None => Ok(None),
189+
Some(settings) => match serde_json::from_value::<T>(settings.clone()) {
190+
Err(e) => Err(merrors::Error::DefinitionLoadingFailure("custom_settings".to_string(), e.to_string())),
191+
Ok(settings) => Ok(Some(settings)),
192+
}
193+
}
194+
}
182195
}
183196

184197
#[cfg(test)]
@@ -326,4 +339,26 @@ mod tests {
326339
assert_eq!(address.clone().unwrap().host, "127.0.0.1");
327340
assert_eq!(address.unwrap().port, 7071);
328341
}
342+
343+
#[test]
344+
fn test_load_service_custom_settings() {
345+
let filename = assets_path().join("definitions/service.toml.ok_custom_settings");
346+
let defs = Definitions::new(filename.to_str(), None);
347+
assert!(defs.is_ok());
348+
349+
let defs = defs.unwrap();
350+
351+
#[derive(Deserialize)]
352+
struct Service {
353+
direction: String,
354+
ipc_port: i32,
355+
}
356+
357+
let s: merrors::Result<Option<Service>> = defs.custom_settings();
358+
assert!(s.is_ok());
359+
360+
let settings = s.unwrap().unwrap();
361+
assert_eq!(settings.direction, "forward");
362+
assert_eq!(settings.ipc_port, 9991);
363+
}
329364
}

0 commit comments

Comments
 (0)