Skip to content

Commit 5381464

Browse files
committed
refactor: FPConfig
1 parent 8ce0e25 commit 5381464

File tree

5 files changed

+59
-84
lines changed

5 files changed

+59
-84
lines changed

examples/demo.rs

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
use feature_probe_server_sdk::{FPConfigBuilder, FPError, FPUser, FeatureProbe};
1+
use feature_probe_server_sdk::{FPConfig, FPError, FPUser, FeatureProbe};
22
use std::time::Duration;
3+
use url::Url;
34

45
// Connect to demo docker environment.
56
// cargo run --example demo
@@ -8,13 +9,18 @@ use std::time::Duration;
89
async fn main() -> Result<(), FPError> {
910
let _ = tracing_subscriber::fmt().init();
1011
// let remote_url = "http://localhost:4009/server"; // for local docker
11-
let remote_url = "https://featureprobe.io/server";
12+
let remote_url = Url::parse("https://featureprobe.io/server").expect("invalid url");
1213
// Server SDK key in Project List Page.
13-
let server_sdk_key = "server-7fa2f771259cb7235b96433d70b91e99abcf6ff8";
14-
let interval = Duration::from_millis(2000);
15-
let config = FPConfigBuilder::new(remote_url.to_owned(), server_sdk_key.to_owned(), interval)
16-
.start_wait(Duration::from_secs(5))
17-
.build()?;
14+
let server_sdk_key = "server-7fa2f771259cb7235b96433d70b91e99abcf6ff8".to_owned();
15+
let refresh_interval = Duration::from_millis(2000);
16+
17+
let config = FPConfig {
18+
remote_url,
19+
server_sdk_key,
20+
refresh_interval,
21+
start_wait: Some(Duration::from_secs(5)),
22+
..Default::default()
23+
};
1824

1925
let fp = FeatureProbe::new(config);
2026
if !fp.initialized() {

src/config.rs

Lines changed: 32 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,11 @@ use reqwest::Client;
55
use tracing::info;
66
use url::Url;
77

8-
use crate::FPError;
9-
10-
#[derive(Debug, Default, Clone)]
11-
pub struct FPConfigBuilder {
12-
pub remote_url: String,
13-
pub toggles_url: Option<String>,
14-
pub events_url: Option<String>,
8+
#[derive(Debug, Clone)]
9+
pub struct FPConfig {
10+
pub remote_url: Url,
11+
pub toggles_url: Option<Url>,
12+
pub events_url: Option<Url>,
1513
pub server_sdk_key: String,
1614
pub refresh_interval: Duration,
1715
#[cfg(feature = "use_tokio")]
@@ -20,7 +18,7 @@ pub struct FPConfigBuilder {
2018
}
2119

2220
#[derive(Debug, Clone)]
23-
pub struct FPConfig {
21+
pub(crate) struct Config {
2422
pub toggles_url: Url,
2523
pub events_url: Url,
2624
pub server_sdk_key: String,
@@ -34,8 +32,9 @@ impl Default for FPConfig {
3432
fn default() -> Self {
3533
Self {
3634
server_sdk_key: "".to_owned(),
37-
toggles_url: Url::parse("http://127.0.0.1:8080").unwrap(),
38-
events_url: Url::parse("http://127.0.0.1:8080").unwrap(),
35+
remote_url: Url::parse("http://127.0.0.1:8080").unwrap(),
36+
toggles_url: None,
37+
events_url: None,
3938
refresh_interval: Duration::from_secs(5),
4039
start_wait: None,
4140
#[cfg(feature = "use_tokio")]
@@ -44,78 +43,49 @@ impl Default for FPConfig {
4443
}
4544
}
4645

47-
impl FPConfigBuilder {
48-
pub fn new(
49-
remote_url: String,
50-
server_sdk_key: String,
51-
refresh_interval: Duration,
52-
) -> FPConfigBuilder {
46+
impl Default for Config {
47+
fn default() -> Self {
5348
Self {
54-
remote_url,
55-
server_sdk_key,
56-
refresh_interval,
57-
..Default::default()
49+
server_sdk_key: "".to_owned(),
50+
toggles_url: Url::parse("http://127.0.0.1:8080").unwrap(),
51+
events_url: Url::parse("http://127.0.0.1:8080").unwrap(),
52+
refresh_interval: Duration::from_secs(5),
53+
start_wait: None,
54+
#[cfg(feature = "use_tokio")]
55+
http_client: None,
5856
}
5957
}
58+
}
6059

61-
pub fn toggles_url(mut self, toggles_url: String) -> FPConfigBuilder {
62-
self.toggles_url = Some(toggles_url);
63-
self
64-
}
65-
66-
pub fn events_url(mut self, events_url: String) -> FPConfigBuilder {
67-
self.events_url = Some(events_url);
68-
self
69-
}
70-
71-
pub fn start_wait(mut self, start_wait: Duration) -> FPConfigBuilder {
72-
self.start_wait = Some(start_wait);
73-
self
74-
}
75-
76-
#[cfg(feature = "use_tokio")]
77-
pub fn http_client(mut self, http_client: Client) -> FPConfigBuilder {
78-
self.http_client = Some(http_client);
79-
self
80-
}
81-
82-
pub fn build(&self) -> Result<FPConfig, FPError> {
60+
impl FPConfig {
61+
pub(crate) fn build(&self) -> Config {
8362
info!("build_config from {:?}", self);
84-
let remote_url = {
85-
if !self.remote_url.ends_with('/') {
86-
self.remote_url.clone() + "/"
87-
} else {
88-
self.remote_url.clone()
89-
}
63+
let remote_url = self.remote_url.to_string();
64+
let remote_url = match remote_url.ends_with('/') {
65+
true => remote_url,
66+
false => remote_url + "/",
9067
};
68+
9169
let toggles_url = match &self.toggles_url {
92-
None => remote_url.clone() + "api/server-sdk/toggles",
70+
None => {
71+
Url::parse(&(remote_url.clone() + "api/server-sdk/toggles")).expect("invalid url")
72+
}
9373
Some(url) => url.to_owned(),
9474
};
9575

96-
let toggles_url: Url = match Url::parse(&toggles_url) {
97-
Err(e) => return Err(FPError::UrlError(e.to_string())),
98-
Ok(url) => url,
99-
};
100-
10176
let events_url = match &self.events_url {
102-
None => remote_url + "api/events",
77+
None => Url::parse(&(remote_url + "api/events")).expect("invalid url"),
10378
Some(url) => url.to_owned(),
10479
};
10580

106-
let events_url: Url = match Url::parse(&events_url) {
107-
Err(e) => return Err(FPError::UrlError(e.to_string())),
108-
Ok(url) => url,
109-
};
110-
111-
Ok(FPConfig {
81+
Config {
11282
toggles_url,
11383
events_url,
11484
server_sdk_key: self.server_sdk_key.clone(),
11585
refresh_interval: self.refresh_interval,
11686
start_wait: self.start_wait,
11787
#[cfg(feature = "use_tokio")]
11888
http_client: self.http_client.clone(),
119-
})
89+
}
12090
}
12191
}

src/feature_probe.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,12 @@ use std::fmt::Debug;
55
use std::sync::Arc;
66
use tracing::trace;
77

8-
use crate::sync::Synchronizer;
98
use crate::user::FPUser;
109
use crate::{
11-
config::FPConfig,
10+
config::Config,
1211
evalutate::{EvalDetail, Repository},
1312
};
13+
use crate::{sync::Synchronizer, FPConfig};
1414
use crate::{FPDetail, SdkAuthorization, Toggle};
1515
#[cfg(feature = "event")]
1616
use feature_probe_event_std::event::AccessEvent;
@@ -31,12 +31,13 @@ pub struct FeatureProbe {
3131
syncer: Option<Synchronizer>,
3232
#[cfg(any(feature = "event", feature = "event_tokio"))]
3333
event_recorder: Option<EventRecorder>,
34-
config: FPConfig,
34+
config: Config,
3535
should_stop: Arc<RwLock<bool>>,
3636
}
3737

3838
impl FeatureProbe {
3939
pub fn new(config: FPConfig) -> Self {
40+
let config = config.build();
4041
let mut slf = Self {
4142
config,
4243
..Default::default()
@@ -102,7 +103,7 @@ impl FeatureProbe {
102103

103104
pub fn new_with(server_key: String, repo: Repository) -> Self {
104105
Self {
105-
config: FPConfig {
106+
config: Config {
106107
server_sdk_key: server_key,
107108
..Default::default()
108109
},

src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ mod feature_probe;
44
mod sync;
55
mod user;
66

7-
pub use crate::config::{FPConfig, FPConfigBuilder};
7+
pub use crate::config::FPConfig;
88
pub use crate::evalutate::{load_json, Repository, Segment, Toggle};
99
pub use crate::feature_probe::FeatureProbe;
1010
pub use crate::user::FPUser;

tests/integration_test.rs

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use feature_probe_server::{
55
repo::SdkRepository,
66
ServerConfig,
77
};
8-
use feature_probe_server_sdk::{FPConfigBuilder, FPUser, FeatureProbe, Url};
8+
use feature_probe_server_sdk::{FPConfig, FPUser, FeatureProbe, Url};
99

1010
#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
1111
async fn integration_test() {
@@ -15,15 +15,13 @@ async fn integration_test() {
1515
let server_port = 19990;
1616
setup_server(api_port, server_port).await;
1717

18-
let config = FPConfigBuilder::new(
19-
format!("http://127.0.0.1:{}", server_port),
20-
"server-sdk-key1".to_owned(),
21-
Duration::from_secs(5),
22-
)
23-
.start_wait(Duration::from_secs(5))
24-
.build();
25-
assert!(config.is_ok());
26-
let config = config.unwrap();
18+
let config = FPConfig {
19+
remote_url: Url::parse(&format!("http://127.0.0.1:{}", server_port)).unwrap(),
20+
server_sdk_key: "server-sdk-key1".to_owned(),
21+
refresh_interval: Duration::from_secs(5),
22+
start_wait: Some(Duration::from_secs(5)),
23+
..Default::default()
24+
};
2725

2826
let fp = FeatureProbe::new(config);
2927

0 commit comments

Comments
 (0)