1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#![allow(unused_variables, dead_code, missing_docs)]
pub mod integration;
pub mod memory_registry;
pub mod protocol;
pub mod types;

use std::fmt::{Debug, Formatter};

use crate::{common::url::Url, registry::memory_registry::MemoryNotifyListener};

pub trait Registry {
    type NotifyListener;

    fn register(&mut self, url: Url) -> Result<(), crate::StdError>;
    fn unregister(&mut self, url: Url) -> Result<(), crate::StdError>;

    fn subscribe(&self, url: Url, listener: Self::NotifyListener) -> Result<(), crate::StdError>;
    fn unsubscribe(&self, url: Url, listener: Self::NotifyListener) -> Result<(), crate::StdError>;
}

pub trait NotifyListener {
    fn notify(&self, event: ServiceEvent);
    fn notify_all(&self, event: ServiceEvent);
}

#[derive(Debug)]
pub struct ServiceEvent {
    pub key: String,
    pub action: String,
    pub service: Vec<Url>,
}

pub type BoxRegistry = Box<dyn Registry<NotifyListener = MemoryNotifyListener> + Send + Sync>;

impl Debug for BoxRegistry {
    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
        f.write_str("BoxRegistry")
    }
}

#[derive(Default)]
pub struct RegistryWrapper {
    pub registry: Option<Box<dyn Registry<NotifyListener = MemoryNotifyListener>>>,
}

impl Clone for RegistryWrapper {
    fn clone(&self) -> Self {
        Self { registry: None }
    }
}

impl Debug for RegistryWrapper {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        f.debug_struct("RegistryWrapper").finish()
    }
}