Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #[derive(Debug)]
- struct Server {
- host: String,
- target: String,
- port: i32,
- timeout: i32,
- }
- impl Default for Server {
- fn default() -> Self {
- Self {
- host: "0.0.0.0".to_string(),
- target: "8.8.8.8".to_string(),
- port: 0,
- timeout: 1000,
- }
- }
- }
- trait Builder {
- type Config : Default;
- fn build(v: &[BuilderFn<Self::Config>]) -> Self::Config {
- let mut ret = Default::default();
- for c in v {
- c(&mut ret)
- }
- ret
- }
- }
- type BuilderFn<T> = Box<dyn Fn(&mut T) -> ()>;
- impl Builder for Server {
- type Config = Self;
- }
- fn host<S>(s: S) -> BuilderFn<Server>
- where
- S: Into<String>,
- {
- let host = s.into();
- Box::new(move |config: &mut Server| config.host = host.clone())
- }
- fn target<S>(s: S) -> BuilderFn<Server>
- where
- S: Into<String>,
- {
- let target = s.into();
- Box::new(move |config: &mut Server| config.target = target.clone())
- }
- fn port(n: i32) -> BuilderFn<Server> {
- Box::new(move |config: &mut Server| config.port = n)
- }
- fn timeout(n: i32) -> BuilderFn<Server> {
- Box::new(move |config: &mut Server| config.timeout = n)
- }
- fn main() {
- let server = Server::build(&[
- port(25),
- host("localhost"),
- target("example.com"),
- timeout(2000),
- ]);
- println!("server = {:?}", server);
- }
Add Comment
Please, Sign In to add comment