实现远程日志

This commit is contained in:
2026-01-29 01:57:40 +08:00
parent f1d846bb8b
commit d8917639af
9 changed files with 649 additions and 2 deletions

384
Cargo.lock generated
View File

@@ -8,7 +8,14 @@ version = "0.1.0"
dependencies = [
"actix",
"actix-web",
"actix-web-actors",
"anyhow",
"chrono",
"colored",
"fern",
"log",
"prost",
"prost-build",
"tokio",
]
@@ -208,6 +215,24 @@ dependencies = [
"url",
]
[[package]]
name = "actix-web-actors"
version = "4.3.1+deprecated"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f98c5300b38fd004fe7d2a964f9a90813fdbe8a81fed500587e78b1b71c6f980"
dependencies = [
"actix",
"actix-codec",
"actix-http",
"actix-web",
"bytes",
"bytestring",
"futures-core",
"pin-project-lite",
"tokio",
"tokio-util",
]
[[package]]
name = "actix-web-codegen"
version = "4.3.0"
@@ -261,12 +286,27 @@ dependencies = [
"alloc-no-stdlib",
]
[[package]]
name = "android_system_properties"
version = "0.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
dependencies = [
"libc",
]
[[package]]
name = "anyhow"
version = "1.0.100"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61"
[[package]]
name = "autocfg"
version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8"
[[package]]
name = "base64"
version = "0.22.1"
@@ -309,6 +349,12 @@ dependencies = [
"alloc-stdlib",
]
[[package]]
name = "bumpalo"
version = "3.19.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5dd9dc738b7a8311c7ade152424974d8115f2cdad61e8dab8dac9f2362298510"
[[package]]
name = "bytes"
version = "1.11.0"
@@ -342,6 +388,28 @@ version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
[[package]]
name = "chrono"
version = "0.4.43"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fac4744fb15ae8337dc853fee7fb3f4e48c0fbaa23d0afe49c447b4fab126118"
dependencies = [
"iana-time-zone",
"js-sys",
"num-traits",
"wasm-bindgen",
"windows-link",
]
[[package]]
name = "colored"
version = "3.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "faf9468729b8cbcea668e36183cb69d317348c2e08e994829fb56ebfdfbaac34"
dependencies = [
"windows-sys 0.61.2",
]
[[package]]
name = "convert_case"
version = "0.10.0"
@@ -362,6 +430,12 @@ dependencies = [
"version_check",
]
[[package]]
name = "core-foundation-sys"
version = "0.8.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
[[package]]
name = "cpufeatures"
version = "0.2.17"
@@ -458,6 +532,12 @@ dependencies = [
"syn",
]
[[package]]
name = "either"
version = "1.15.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719"
[[package]]
name = "encoding_rs"
version = "0.8.35"
@@ -483,12 +563,33 @@ dependencies = [
"windows-sys 0.61.2",
]
[[package]]
name = "fastrand"
version = "2.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be"
[[package]]
name = "fern"
version = "0.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4316185f709b23713e41e3195f90edef7fb00c3ed4adc79769cf09cc762a3b29"
dependencies = [
"log",
]
[[package]]
name = "find-msvc-tools"
version = "0.1.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8591b0bcc8a98a64310a2fae1bb3e9b8564dd10e381e6e28010fde8e8e8568db"
[[package]]
name = "fixedbitset"
version = "0.5.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99"
[[package]]
name = "flate2"
version = "1.1.8"
@@ -591,12 +692,27 @@ dependencies = [
"tracing",
]
[[package]]
name = "hashbrown"
version = "0.15.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1"
dependencies = [
"foldhash",
]
[[package]]
name = "hashbrown"
version = "0.16.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100"
[[package]]
name = "heck"
version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
[[package]]
name = "http"
version = "0.2.12"
@@ -620,6 +736,30 @@ version = "1.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9"
[[package]]
name = "iana-time-zone"
version = "0.1.65"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470"
dependencies = [
"android_system_properties",
"core-foundation-sys",
"iana-time-zone-haiku",
"js-sys",
"log",
"wasm-bindgen",
"windows-core",
]
[[package]]
name = "iana-time-zone-haiku"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f"
dependencies = [
"cc",
]
[[package]]
name = "icu_collections"
version = "2.1.1"
@@ -735,7 +875,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017"
dependencies = [
"equivalent",
"hashbrown",
"hashbrown 0.16.1",
]
[[package]]
name = "itertools"
version = "0.14.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285"
dependencies = [
"either",
]
[[package]]
@@ -754,6 +903,16 @@ dependencies = [
"libc",
]
[[package]]
name = "js-sys"
version = "0.3.85"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8c942ebf8e95485ca0d52d97da7c5a2c387d0e7f0ba4c35e93bfcaee045955b3"
dependencies = [
"once_cell",
"wasm-bindgen",
]
[[package]]
name = "language-tags"
version = "0.3.2"
@@ -766,6 +925,12 @@ version = "0.2.180"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bcc35a38544a891a5f7c865aca548a982ccb3b8650a5b06d0fd33a10283c56fc"
[[package]]
name = "linux-raw-sys"
version = "0.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039"
[[package]]
name = "litemap"
version = "0.8.1"
@@ -838,12 +1003,27 @@ dependencies = [
"windows-sys 0.61.2",
]
[[package]]
name = "multimap"
version = "0.10.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1d87ecb2933e8aeadb3e3a02b828fed80a7528047e68b4f424523a0981a3a084"
[[package]]
name = "num-conv"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cf97ec579c3c42f953ef76dbf8d55ac91fb219dde70e49aa4a6b7d74e9919050"
[[package]]
name = "num-traits"
version = "0.2.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
dependencies = [
"autocfg",
]
[[package]]
name = "once_cell"
version = "1.21.3"
@@ -879,6 +1059,17 @@ version = "2.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220"
[[package]]
name = "petgraph"
version = "0.8.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8701b58ea97060d5e5b155d383a69952a60943f0e6dfe30b04c287beb0b27455"
dependencies = [
"fixedbitset",
"hashbrown 0.15.5",
"indexmap",
]
[[package]]
name = "pin-project-lite"
version = "0.2.16"
@@ -921,6 +1112,16 @@ dependencies = [
"zerocopy",
]
[[package]]
name = "prettyplease"
version = "0.2.37"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b"
dependencies = [
"proc-macro2",
"syn",
]
[[package]]
name = "proc-macro2"
version = "1.0.106"
@@ -930,6 +1131,57 @@ dependencies = [
"unicode-ident",
]
[[package]]
name = "prost"
version = "0.14.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d2ea70524a2f82d518bce41317d0fae74151505651af45faf1ffbd6fd33f0568"
dependencies = [
"bytes",
"prost-derive",
]
[[package]]
name = "prost-build"
version = "0.14.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "343d3bd7056eda839b03204e68deff7d1b13aba7af2b2fd16890697274262ee7"
dependencies = [
"heck",
"itertools",
"log",
"multimap",
"petgraph",
"prettyplease",
"prost",
"prost-types",
"regex",
"syn",
"tempfile",
]
[[package]]
name = "prost-derive"
version = "0.14.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "27c6023962132f4b30eb4c172c91ce92d933da334c59c23cddee82358ddafb0b"
dependencies = [
"anyhow",
"itertools",
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "prost-types"
version = "0.14.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8991c4cbdb8bc5b11f0b074ffe286c30e523de90fee5ba8132f1399f23cb3dd7"
dependencies = [
"prost",
]
[[package]]
name = "quote"
version = "1.0.44"
@@ -1027,6 +1279,25 @@ dependencies = [
"semver",
]
[[package]]
name = "rustix"
version = "1.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "146c9e247ccc180c1f61615433868c99f3de3ae256a30a43b49f67c2d9171f34"
dependencies = [
"bitflags",
"errno",
"libc",
"linux-raw-sys",
"windows-sys 0.61.2",
]
[[package]]
name = "rustversion"
version = "1.0.22"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d"
[[package]]
name = "ryu"
version = "1.0.22"
@@ -1192,6 +1463,19 @@ dependencies = [
"syn",
]
[[package]]
name = "tempfile"
version = "3.24.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "655da9c7eb6305c55742045d5a8d2037996d61d8de95806335c7c86ce0f82e9c"
dependencies = [
"fastrand",
"getrandom",
"once_cell",
"rustix",
"windows-sys 0.61.2",
]
[[package]]
name = "time"
version = "0.3.46"
@@ -1369,12 +1653,110 @@ dependencies = [
"wit-bindgen",
]
[[package]]
name = "wasm-bindgen"
version = "0.2.108"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "64024a30ec1e37399cf85a7ffefebdb72205ca1c972291c51512360d90bd8566"
dependencies = [
"cfg-if",
"once_cell",
"rustversion",
"wasm-bindgen-macro",
"wasm-bindgen-shared",
]
[[package]]
name = "wasm-bindgen-macro"
version = "0.2.108"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "008b239d9c740232e71bd39e8ef6429d27097518b6b30bdf9086833bd5b6d608"
dependencies = [
"quote",
"wasm-bindgen-macro-support",
]
[[package]]
name = "wasm-bindgen-macro-support"
version = "0.2.108"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5256bae2d58f54820e6490f9839c49780dff84c65aeab9e772f15d5f0e913a55"
dependencies = [
"bumpalo",
"proc-macro2",
"quote",
"syn",
"wasm-bindgen-shared",
]
[[package]]
name = "wasm-bindgen-shared"
version = "0.2.108"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1f01b580c9ac74c8d8f0c0e4afb04eeef2acf145458e52c03845ee9cd23e3d12"
dependencies = [
"unicode-ident",
]
[[package]]
name = "windows-core"
version = "0.62.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb"
dependencies = [
"windows-implement",
"windows-interface",
"windows-link",
"windows-result",
"windows-strings",
]
[[package]]
name = "windows-implement"
version = "0.60.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "windows-interface"
version = "0.59.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "windows-link"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5"
[[package]]
name = "windows-result"
version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5"
dependencies = [
"windows-link",
]
[[package]]
name = "windows-strings"
version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091"
dependencies = [
"windows-link",
]
[[package]]
name = "windows-sys"
version = "0.52.0"

View File

@@ -6,5 +6,14 @@ edition = "2024"
[dependencies]
actix = "0.13.5"
actix-web = "4.12.1"
actix-web-actors = "4.3.1"
anyhow = "1.0.100"
chrono = "0.4.43"
colored = "3.1.1"
fern = "0.7.1"
log = "0.4.29"
prost = "0.14.3"
tokio = { version = "1.49.0", features = ["full"] }
[build-dependencies]
prost-build = "0.14.3"

65
build.rs Normal file
View File

@@ -0,0 +1,65 @@
use std::error::Error;
use std::fs;
use std::path::{Path, PathBuf};
use std::str::FromStr;
fn get_filenames(dir: &str) -> Result<Vec<String>, std::io::Error> {
println!("cargo:rerun-if-changed=proto");
let entries = fs::read_dir(Path::new(dir))?;
let filenames: Vec<String> = entries
.filter_map(|entry| {
let path = entry.ok()?.path();
if path.is_file() {
path.file_name()?.to_str().map(|s| s.to_owned())
} else {
None
}
})
.collect();
Ok(filenames)
}
fn main() -> Result<(), Box<dyn Error>> {
let out_dir = "src/protobuf";
if PathBuf::from_str(out_dir)?.exists() {
fs::remove_dir_all(out_dir).expect("清空输出目录出错");
}
fs::create_dir_all(out_dir).expect("创建输出目录出错");
let proto_list = get_filenames("proto")
.expect("读取Protobuf定义文件列表失败")
.iter()
.filter_map(|file| {
if file.ends_with(".proto") {
Some(file.clone())
} else {
None
}
})
.collect::<Vec<_>>();
prost_build::Config::new()
.out_dir(out_dir)
.compile_protos(&proto_list, &["proto/".to_string()])?;
//tonic_prost_build::configure()
// .out_dir(out_dir)
// .compile_protos(&proto_list, &["proto/".to_string()])?;
let mod_file = format!("{}/mod.rs", out_dir);
let mod_content = get_filenames(out_dir).expect("无法列出目录内容");
let mod_content = mod_content
.iter()
.map(|file| format!("pub mod {};", file.trim_end_matches(".rs")))
.collect::<Vec<_>>()
.join("\n");
fs::write(&mod_file, mod_content).expect("写出文件失败");
fs::write(
format!("{}/README.md", out_dir),
"# Warning\n\n[protobuf](../protobuf) 中的文件由构建脚本生成,重新生成时将会**删除**此目录内的**全部文件**\
,请不要在此目录内工作,否则可能丢失工作进度!\n\n## 你被警告了!",
)?;
Ok(())
}

17
proto/message.proto Normal file
View File

@@ -0,0 +1,17 @@
syntax = "proto3";
package gou;
enum MessageType {
MESSAGE_TYPE_TRACE = 0;
MESSAGE_TYPE_DEBUG = 1;
MESSAGE_TYPE_INFO = 2;
MESSAGE_TYPE_WARNING = 3;
MESSAGE_TYPE_ERROR = 4;
}
message Starpoles {
MessageType type = 1;
string message = 2;
}

View File

@@ -1,8 +1,16 @@
pub mod manager;
pub mod protobuf;
use actix_web::{App, HttpResponse, HttpServer, Responder, get, web};
use chrono::Local;
use colored::{Color, Colorize};
use fern::Dispatch;
use log::Level;
#[tokio::main]
async fn main() {
HttpServer::new(|| App::new().service(root))
init_log();
HttpServer::new(|| App::new().service(root).service(manager::ws_connect))
.bind(("0.0.0.0", 2018))
.unwrap()
.run()
@@ -10,6 +18,34 @@ async fn main() {
.unwrap();
}
fn get_time() -> String {
let now = Local::now();
now.format("%Y-%m-%d %H:%M:%S").to_string()
}
fn init_log() {
let mut console_dispatch = Dispatch::new()
.format(|out, message, record| {
let (color, title) = match record.level() {
Level::Error => (Color::Red, "Error"),
Level::Warn => (Color::Yellow, "Warn"),
Level::Info => (Color::Green, "Info"),
Level::Debug => (Color::BrightWhite, "Debug"),
Level::Trace => (Color::White, "Trace"),
};
out.finish(format_args!(
"[{} {}]\t{}",
get_time(),
title.color(color),
message
))
})
.chain(std::io::stdout())
.level(log::LevelFilter::Debug);
console_dispatch.apply().expect("写入日志失败");
}
#[get("/")]
async fn root() -> impl Responder {
HttpResponse::Ok()

89
src/manager.rs Normal file
View File

@@ -0,0 +1,89 @@
use crate::protobuf::gou::{MessageType, Starpoles};
use actix::{Actor, ActorContext, StreamHandler};
use actix_web::{HttpRequest, HttpResponse, get, web};
use actix_web_actors::ws;
use actix_web_actors::ws::{Message, ProtocolError};
use log::{debug, error, info, trace, warn};
use prost::{DecodeError, Message as WebMessage};
pub struct WebSocketClient {}
impl WebSocketClient {
pub fn new() -> Self {
Self {}
}
}
impl Actor for WebSocketClient {
type Context = ws::WebsocketContext<Self>;
}
impl StreamHandler<Result<Message, ProtocolError>> for WebSocketClient {
fn handle(&mut self, item: Result<Message, ProtocolError>, ctx: &mut Self::Context) {
let item = match item {
Ok(item) => item,
Err(err) => {
error!("[Logger] 协议错误:{:?}", err);
ctx.close(None);
ctx.stop();
return;
}
};
match item {
Message::Text(_) => {
debug!("[Logger] 不支持的消息类型");
}
Message::Binary(binary) => {
let package = Starpoles::decode(binary);
let package = match package {
Ok(package) => package,
Err(err) => {
info!("[Logger] 远端数据包无法解析:{:?}", err);
return;
}
};
let message_type = MessageType::try_from(package.r#type);
let message_type = if let Ok(message_type) = message_type {
message_type
} else {
warn!("[Logger] 无法解析消息类型:{}", package.r#type);
return;
};
match message_type {
MessageType::Trace => {
trace!("{}", package.message);
}
MessageType::Debug => {
debug!("{}", package.message);
}
MessageType::Info => {
info!("{}", package.message);
}
MessageType::Warning => {
warn!("{}", package.message);
}
MessageType::Error => {
error!("{}", package.message);
}
}
}
Message::Continuation(_) => {}
Message::Ping(ping) => {
ctx.pong(&ping);
}
Message::Pong(_) => {}
Message::Close(_) => {
ctx.stop();
}
Message::Nop => {}
}
}
}
#[get("/connect")]
async fn ws_connect(req: HttpRequest, stream: web::Payload) -> HttpResponse {
let info = WebSocketClient::new();
let resp = ws::start(info, &req, stream);
resp.unwrap_or_else(|e| e.error_response())
}

5
src/protobuf/README.md Normal file
View File

@@ -0,0 +1,5 @@
# Warning
[protobuf](../protobuf) 中的文件由构建脚本生成,重新生成时将会**删除**此目录内的**全部文件**,请不要在此目录内工作,否则可能丢失工作进度!
## 你被警告了!

43
src/protobuf/gou.rs Normal file
View File

@@ -0,0 +1,43 @@
// This file is @generated by prost-build.
#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
pub struct Starpoles {
#[prost(enumeration = "MessageType", tag = "1")]
pub r#type: i32,
#[prost(string, tag = "2")]
pub message: ::prost::alloc::string::String,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, ::prost::Enumeration)]
#[repr(i32)]
pub enum MessageType {
Trace = 0,
Debug = 1,
Info = 2,
Warning = 3,
Error = 4,
}
impl MessageType {
/// String value of the enum field names used in the ProtoBuf definition.
///
/// The values are not transformed in any way and thus are considered stable
/// (if the ProtoBuf definition does not change) and safe for programmatic use.
pub fn as_str_name(&self) -> &'static str {
match self {
Self::Trace => "MESSAGE_TYPE_TRACE",
Self::Debug => "MESSAGE_TYPE_DEBUG",
Self::Info => "MESSAGE_TYPE_INFO",
Self::Warning => "MESSAGE_TYPE_WARNING",
Self::Error => "MESSAGE_TYPE_ERROR",
}
}
/// Creates an enum from field names used in the ProtoBuf definition.
pub fn from_str_name(value: &str) -> ::core::option::Option<Self> {
match value {
"MESSAGE_TYPE_TRACE" => Some(Self::Trace),
"MESSAGE_TYPE_DEBUG" => Some(Self::Debug),
"MESSAGE_TYPE_INFO" => Some(Self::Info),
"MESSAGE_TYPE_WARNING" => Some(Self::Warning),
"MESSAGE_TYPE_ERROR" => Some(Self::Error),
_ => None,
}
}
}

1
src/protobuf/mod.rs Normal file
View File

@@ -0,0 +1 @@
pub mod gou;