Initial architecture
This commit is contained in:
parent
140a094b15
commit
35c94460db
|
@ -3,6 +3,19 @@ name = "cc"
|
||||||
version = "1.0.28"
|
version = "1.0.28"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "dtoa"
|
||||||
|
version = "0.4.3"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "getopts"
|
||||||
|
version = "0.2.18"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "libloading"
|
name = "libloading"
|
||||||
version = "0.5.0"
|
version = "0.5.0"
|
||||||
|
@ -12,13 +25,84 @@ dependencies = [
|
||||||
"winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
"winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "linked-hash-map"
|
||||||
|
version = "0.5.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "proc-macro2"
|
||||||
|
version = "0.4.26"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "quote"
|
||||||
|
version = "0.6.11"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2 0.4.26 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rnetmon"
|
name = "rnetmon"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
"getopts 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"libloading 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"libloading 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"serde 1.0.85 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"serde_derive 1.0.85 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"serde_yaml 0.8.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "serde"
|
||||||
|
version = "1.0.85"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "serde_derive"
|
||||||
|
version = "1.0.85"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2 0.4.26 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"syn 0.15.26 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "serde_yaml"
|
||||||
|
version = "0.8.8"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"dtoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"linked-hash-map 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"serde 1.0.85 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"yaml-rust 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "syn"
|
||||||
|
version = "0.15.26"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2 0.4.26 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "unicode-width"
|
||||||
|
version = "0.1.5"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "unicode-xid"
|
||||||
|
version = "0.1.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "winapi"
|
name = "winapi"
|
||||||
version = "0.3.6"
|
version = "0.3.6"
|
||||||
|
@ -38,9 +122,29 @@ name = "winapi-x86_64-pc-windows-gnu"
|
||||||
version = "0.4.0"
|
version = "0.4.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "yaml-rust"
|
||||||
|
version = "0.4.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"linked-hash-map 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
[metadata]
|
[metadata]
|
||||||
"checksum cc 1.0.28 (registry+https://github.com/rust-lang/crates.io-index)" = "bb4a8b715cb4597106ea87c7c84b2f1d452c7492033765df7f32651e66fcf749"
|
"checksum cc 1.0.28 (registry+https://github.com/rust-lang/crates.io-index)" = "bb4a8b715cb4597106ea87c7c84b2f1d452c7492033765df7f32651e66fcf749"
|
||||||
|
"checksum dtoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6d301140eb411af13d3115f9a562c85cc6b541ade9dfa314132244aaee7489dd"
|
||||||
|
"checksum getopts 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)" = "0a7292d30132fb5424b354f5dc02512a86e4c516fe544bb7a25e7f266951b797"
|
||||||
"checksum libloading 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9c3ad660d7cb8c5822cd83d10897b0f1f1526792737a179e73896152f85b88c2"
|
"checksum libloading 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9c3ad660d7cb8c5822cd83d10897b0f1f1526792737a179e73896152f85b88c2"
|
||||||
|
"checksum linked-hash-map 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "70fb39025bc7cdd76305867c4eccf2f2dcf6e9a57f5b21a93e1c2d86cd03ec9e"
|
||||||
|
"checksum proc-macro2 0.4.26 (registry+https://github.com/rust-lang/crates.io-index)" = "38fddd23d98b2144d197c0eca5705632d4fe2667d14a6be5df8934f8d74f1978"
|
||||||
|
"checksum quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)" = "cdd8e04bd9c52e0342b406469d494fcb033be4bdbe5c606016defbb1681411e1"
|
||||||
|
"checksum serde 1.0.85 (registry+https://github.com/rust-lang/crates.io-index)" = "534b8b91a95e0f71bca3ed5824752d558da048d4248c91af873b63bd60519752"
|
||||||
|
"checksum serde_derive 1.0.85 (registry+https://github.com/rust-lang/crates.io-index)" = "a915306b0f1ac5607797697148c223bedeaa36bcc2e28a01441cd638cc6567b4"
|
||||||
|
"checksum serde_yaml 0.8.8 (registry+https://github.com/rust-lang/crates.io-index)" = "0887a8e097a69559b56aa2526bf7aff7c3048cf627dff781f0b56a6001534593"
|
||||||
|
"checksum syn 0.15.26 (registry+https://github.com/rust-lang/crates.io-index)" = "f92e629aa1d9c827b2bb8297046c1ccffc57c99b947a680d3ccff1f136a3bee9"
|
||||||
|
"checksum unicode-width 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "882386231c45df4700b275c7ff55b6f3698780a650026380e72dabe76fa46526"
|
||||||
|
"checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc"
|
||||||
"checksum winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "92c1eb33641e276cfa214a0522acad57be5c56b10cb348b3c5117db75f3ac4b0"
|
"checksum winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "92c1eb33641e276cfa214a0522acad57be5c56b10cb348b3c5117db75f3ac4b0"
|
||||||
"checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
|
"checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
|
||||||
"checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
|
"checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
|
||||||
|
"checksum yaml-rust 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "95acf0db5515d07da9965ec0e0ba6cc2d825e2caeb7303b66ca441729801254e"
|
||||||
|
|
|
@ -5,4 +5,8 @@ authors = ["Thibaut CHARLES"]
|
||||||
edition = "2018"
|
edition = "2018"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
libloading = "0.5.0"
|
libloading = "0.5.0"
|
||||||
|
serde = "1.0"
|
||||||
|
serde_yaml = "0.8"
|
||||||
|
serde_derive = "1.0"
|
||||||
|
getopts = "0.2"
|
|
@ -0,0 +1,6 @@
|
||||||
|
monitors:
|
||||||
|
- name: tester
|
||||||
|
- name: tester
|
||||||
|
|
||||||
|
outputs:
|
||||||
|
- name: stdout
|
|
@ -0,0 +1,8 @@
|
||||||
|
use serde_derive::*;
|
||||||
|
use std::collections::HashMap;
|
||||||
|
|
||||||
|
#[derive(Debug, PartialEq, Serialize, Deserialize)]
|
||||||
|
pub struct Config {
|
||||||
|
pub monitors: Vec<HashMap<String, serde_yaml::Value>>,
|
||||||
|
pub outputs: Vec<HashMap<String, serde_yaml::Value>>,
|
||||||
|
}
|
125
src/main.rs
125
src/main.rs
|
@ -1,63 +1,115 @@
|
||||||
|
mod config;
|
||||||
mod message;
|
mod message;
|
||||||
mod monitor;
|
mod monitor;
|
||||||
mod output;
|
mod output;
|
||||||
mod plugins;
|
mod plugins;
|
||||||
|
|
||||||
use std::thread;
|
extern crate getopts;
|
||||||
|
extern crate serde_derive;
|
||||||
|
extern crate serde_yaml;
|
||||||
|
|
||||||
|
use std::env;
|
||||||
|
use std::fs::File;
|
||||||
|
use std::io::prelude::*;
|
||||||
use std::sync::mpsc;
|
use std::sync::mpsc;
|
||||||
|
use std::thread;
|
||||||
|
|
||||||
use crate::monitor::Monitor;
|
use getopts::Options;
|
||||||
use crate::output::Output;
|
|
||||||
use crate::message::Message;
|
|
||||||
|
|
||||||
|
use crate::config::*;
|
||||||
|
use crate::message::*;
|
||||||
|
use crate::monitor::*;
|
||||||
|
use crate::output::*;
|
||||||
|
|
||||||
|
fn monitor_factory(name: &str, config: &HashMap<String, serde_yaml::Value>) -> Box<Monitor + Send> {
|
||||||
|
match name {
|
||||||
|
"tester" => Box::new(plugins::monitor::tester::Tester::new(&config)),
|
||||||
|
_ => panic!("Unknown monitor name: {}", name),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn output_factory(name: &str, config: &HashMap<String, serde_yaml::Value>) -> Box<Output + Send> {
|
||||||
|
match name {
|
||||||
|
"stdout" => Box::new(plugins::output::stdout::Stdout::new(&config)),
|
||||||
|
_ => panic!("Unknown monitor name: {}", name),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
// let lib = Library::new("/home/crom/.gitprojects/rnetmon/plugins/output/stdout/target/debug/deps/libstdout.so").unwrap();
|
let args: Vec<String> = env::args().collect();
|
||||||
|
|
||||||
// unsafe {
|
// Parse command line args
|
||||||
// let handle_message: Symbol<unsafe fn()> = lib.get(b"handle_message").unwrap();
|
let mut opts = Options::new();
|
||||||
// handle_message();
|
opts.optopt(
|
||||||
// }
|
"c",
|
||||||
// let msg = Message{
|
"config",
|
||||||
// emitter: "me".to_string(),
|
"Path to config.yaml. Default: ./config.yaml",
|
||||||
// level: 10,
|
"config.yaml",
|
||||||
// msg_type: "string".to_string(),
|
);
|
||||||
// text: "Consectetur duis do dolor deserunt est minim dolore tempor et non duis.".to_string(),
|
opts.optflag("h", "help", "print this help menu");
|
||||||
// };
|
|
||||||
|
let matches = match opts.parse(&args[1..]) {
|
||||||
|
Ok(m) => m,
|
||||||
|
Err(f) => panic!(f.to_string()),
|
||||||
|
};
|
||||||
|
if matches.opt_present("h") {
|
||||||
|
let brief = format!("Usage: {} [options]", args[0]);
|
||||||
|
print!("{}", opts.usage(&brief));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Parse config
|
||||||
|
let config_path = matches.opt_str("c").unwrap_or("./config.yaml".to_string());
|
||||||
|
let mut config_file = File::open(config_path).expect("Could not open configuration file");
|
||||||
|
let mut config_content = String::new();
|
||||||
|
config_file
|
||||||
|
.read_to_string(&mut config_content)
|
||||||
|
.expect("Could not read configuration file");
|
||||||
|
let config: Config =
|
||||||
|
serde_yaml::from_str(&config_content).expect("Invalid config file content");
|
||||||
|
|
||||||
|
// Monitors -> dispatcher channel
|
||||||
let (mon_sender, mon_receiver) = mpsc::channel();
|
let (mon_sender, mon_receiver) = mpsc::channel();
|
||||||
|
|
||||||
// let mut monitors: Vec<(Box<Monitor>, thread::JoinHandle<_>)> = vec![];
|
// Instantiate monitor threads and structs
|
||||||
let mut monitor_threads: Vec<thread::JoinHandle<_>> = vec![];
|
for mon_config in config.monitors {
|
||||||
{
|
let name = mon_config
|
||||||
|
.get("name")
|
||||||
|
.expect("Missing `name` key for monitor")
|
||||||
|
.as_str()
|
||||||
|
.expect("Key `name` for monitor is not a string");
|
||||||
|
|
||||||
|
println!("Loading monitor: {}", name);
|
||||||
|
|
||||||
let snd = mon_sender.clone();
|
let snd = mon_sender.clone();
|
||||||
let mon = plugins::monitor::tester::Tester::new();
|
let mut mon = monitor_factory(name, &mon_config);
|
||||||
let thread = thread::spawn(move|| {
|
thread::spawn(move || loop {
|
||||||
loop {
|
mon.run(&snd);
|
||||||
mon.run(&snd);
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
monitor_threads.push(thread)
|
|
||||||
// monitor_threads.push((mon, thread));
|
|
||||||
}
|
}
|
||||||
let monitor_threads = monitor_threads;
|
|
||||||
|
|
||||||
|
|
||||||
|
// Instantiate output threads and structs
|
||||||
let mut output_senders: Vec<mpsc::Sender<Message>> = vec![];
|
let mut output_senders: Vec<mpsc::Sender<Message>> = vec![];
|
||||||
let mut output_threads: Vec<thread::JoinHandle<_>> = vec![];
|
for out_config in config.outputs {
|
||||||
{
|
let name = out_config
|
||||||
|
.get("name")
|
||||||
|
.expect("Missing `name` key for monitor")
|
||||||
|
.as_str()
|
||||||
|
.expect("Key `name` for monitor is not a string");
|
||||||
|
|
||||||
|
println!("Loading output: {}", name);
|
||||||
|
|
||||||
let (out_sender, out_receiver) = mpsc::channel();
|
let (out_sender, out_receiver) = mpsc::channel();
|
||||||
output_senders.push(out_sender);
|
output_senders.push(out_sender);
|
||||||
|
|
||||||
let thread = thread::spawn(move|| {
|
let mut output = output_factory(name, &out_config);
|
||||||
loop {
|
|
||||||
let message = out_receiver.recv().unwrap();
|
thread::spawn(move || loop {
|
||||||
println!("{:?}", message);
|
let message = out_receiver.recv().unwrap();
|
||||||
}
|
output.process_message(message);
|
||||||
});
|
});
|
||||||
output_threads.push(thread);
|
|
||||||
}
|
}
|
||||||
let output_senders = output_senders;
|
let output_senders = output_senders;
|
||||||
let output_threads = output_threads;
|
|
||||||
|
|
||||||
// Dispatch messages
|
// Dispatch messages
|
||||||
loop {
|
loop {
|
||||||
|
@ -66,5 +118,4 @@ fn main() {
|
||||||
out.send(message.clone()).unwrap();
|
out.send(message.clone()).unwrap();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,21 +1,7 @@
|
||||||
|
#[derive(Debug, Clone)]
|
||||||
|
|
||||||
#[derive(Debug)]
|
|
||||||
#[derive(Clone)]
|
|
||||||
pub struct Message {
|
pub struct Message {
|
||||||
pub emitter: String,
|
pub emitter: String,
|
||||||
pub level: i32,
|
pub level: i32,
|
||||||
pub msg_type: String,
|
pub msg_type: String,
|
||||||
pub text: String,
|
pub text: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
// impl Clone for Message {
|
|
||||||
// fn clone(&self) -> Self {
|
|
||||||
// Message{
|
|
||||||
// emitter: self.emitter.clone(),
|
|
||||||
// level: self.level,
|
|
||||||
// msg_type: self.msg_type.clone(),
|
|
||||||
// text: self.text.clone(),
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
|
@ -1,9 +1,11 @@
|
||||||
|
|
||||||
use crate::message::Message;
|
use crate::message::Message;
|
||||||
|
|
||||||
|
pub use std::collections::HashMap;
|
||||||
pub use std::sync::mpsc;
|
pub use std::sync::mpsc;
|
||||||
|
|
||||||
pub trait Monitor {
|
pub trait Monitor {
|
||||||
fn new() -> Self where Self: Sized;
|
fn new(config: &HashMap<String, serde_yaml::Value>) -> Self
|
||||||
fn run(&self, sender: &mpsc::Sender<Message>);
|
where
|
||||||
}
|
Self: Sized;
|
||||||
|
fn run(&mut self, sender: &mpsc::Sender<Message>);
|
||||||
|
}
|
||||||
|
|
|
@ -1,8 +1,10 @@
|
||||||
|
|
||||||
use crate::message::Message;
|
use crate::message::Message;
|
||||||
use std::sync::mpsc;
|
|
||||||
|
pub use std::collections::HashMap;
|
||||||
|
|
||||||
pub trait Output {
|
pub trait Output {
|
||||||
fn new(receiver: mpsc::Receiver<Message>) -> Self;
|
fn new(config: &HashMap<String, serde_yaml::Value>) -> Self
|
||||||
fn on_message(&self, message: Message);
|
where
|
||||||
}
|
Self: Sized;
|
||||||
|
fn process_message(&mut self, message: Message);
|
||||||
|
}
|
||||||
|
|
|
@ -1,2 +1,2 @@
|
||||||
|
pub mod monitor;
|
||||||
pub mod output;
|
pub mod output;
|
||||||
pub mod monitor;
|
|
|
@ -1 +1 @@
|
||||||
pub mod tester;
|
pub mod tester;
|
||||||
|
|
|
@ -1,31 +1,27 @@
|
||||||
|
|
||||||
pub use crate::monitor::Monitor;
|
|
||||||
pub use crate::message::Message;
|
pub use crate::message::Message;
|
||||||
pub use std::sync::mpsc;
|
pub use crate::monitor::*;
|
||||||
|
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct Tester {
|
pub struct Tester {
|
||||||
|
cnt: i64,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Monitor for Tester {
|
impl Monitor for Tester {
|
||||||
fn new() -> Self {
|
fn new(config: &HashMap<String, serde_yaml::Value>) -> Self {
|
||||||
Tester{}
|
Tester { cnt: 0 }
|
||||||
}
|
}
|
||||||
fn run(&self, sender: &mpsc::Sender<Message>) {
|
fn run(&mut self, sender: &mpsc::Sender<Message>) {
|
||||||
|
println!("-- Sending message {}", self.cnt);
|
||||||
|
sender
|
||||||
|
.send(Message {
|
||||||
|
emitter: "me".to_string(),
|
||||||
|
level: 10,
|
||||||
|
msg_type: "string".to_string(),
|
||||||
|
text: format!("This is message number {}", self.cnt),
|
||||||
|
})
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
loop {
|
self.cnt += 1;
|
||||||
println!("-- Sending message");
|
std::thread::sleep(std::time::Duration::from_millis(2000));
|
||||||
sender.send(Message{
|
}
|
||||||
emitter: "me".to_string(),
|
}
|
||||||
level: 10,
|
|
||||||
msg_type: "string".to_string(),
|
|
||||||
text: "Consectetur duis do dolor deserunt est minim dolore tempor et non duis.".to_string(),
|
|
||||||
}).unwrap();
|
|
||||||
|
|
||||||
std::thread::sleep(std::time::Duration::from_millis(2000));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
pub mod stdout;
|
pub mod stdout;
|
||||||
|
|
|
@ -1,20 +1,14 @@
|
||||||
|
|
||||||
use crate::message::Message;
|
use crate::message::Message;
|
||||||
pub use crate::output::Output;
|
pub use crate::output::*;
|
||||||
use std::sync::mpsc;
|
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct Stdout {
|
pub struct Stdout {}
|
||||||
receiver: mpsc::Receiver<Message>,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Output for Stdout {
|
impl Output for Stdout {
|
||||||
fn new(receiver: mpsc::Receiver<Message>) -> Self {
|
fn new(config: &HashMap<String, serde_yaml::Value>) -> Self {
|
||||||
Stdout{
|
Stdout {}
|
||||||
receiver: receiver
|
}
|
||||||
}
|
fn process_message(&mut self, message: Message) {
|
||||||
}
|
println!("Received message: {:?}", message);
|
||||||
fn on_message(&self, message: Message){
|
}
|
||||||
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
Loading…
Reference in New Issue