Message struct, uuid

status
~erin 2023-04-02 19:01:47 -04:00
parent 46bb2862d0
commit 85869b9581
Signed by: erin
GPG Key ID: 9A8E308CEFA37A47
6 changed files with 169 additions and 31 deletions

84
Cargo.lock generated
View File

@ -34,6 +34,7 @@ dependencies = [
"serde_json",
"tokio",
"url",
"uuid",
]
[[package]]
@ -44,6 +45,8 @@ dependencies = [
"serde_json",
"tokio",
"url",
"uuid",
"uuid-simd",
]
[[package]]
@ -55,6 +58,17 @@ dependencies = [
"percent-encoding",
]
[[package]]
name = "getrandom"
version = "0.2.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31"
dependencies = [
"cfg-if",
"libc",
"wasi",
]
[[package]]
name = "hermit-abi"
version = "0.2.6"
@ -127,6 +141,12 @@ dependencies = [
"libc",
]
[[package]]
name = "outref"
version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4030760ffd992bef45b0ae3f10ce1aba99e33464c90d14dd7c039884963ddc7a"
[[package]]
name = "parking_lot"
version = "0.12.1"
@ -162,6 +182,12 @@ version = "0.2.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116"
[[package]]
name = "ppv-lite86"
version = "0.2.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de"
[[package]]
name = "proc-macro2"
version = "1.0.55"
@ -180,6 +206,36 @@ dependencies = [
"proc-macro2",
]
[[package]]
name = "rand"
version = "0.8.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
dependencies = [
"libc",
"rand_chacha",
"rand_core",
]
[[package]]
name = "rand_chacha"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
dependencies = [
"ppv-lite86",
"rand_core",
]
[[package]]
name = "rand_core"
version = "0.6.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
dependencies = [
"getrandom",
]
[[package]]
name = "redox_syscall"
version = "0.2.16"
@ -346,6 +402,34 @@ dependencies = [
"serde",
]
[[package]]
name = "uuid"
version = "1.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1674845326ee10d37ca60470760d4288a6f80f304007d92e5c53bab78c9cfd79"
dependencies = [
"getrandom",
"rand",
"serde",
]
[[package]]
name = "uuid-simd"
version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "23b082222b4f6619906941c17eb2297fff4c2fb96cb60164170522942a200bd8"
dependencies = [
"outref",
"uuid",
"vsimd",
]
[[package]]
name = "vsimd"
version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5c3082ca00d5a5ef149bb8b555a72ae84c9c59f7250f013ac822ac2e49b19c64"
[[package]]
name = "wasi"
version = "0.11.0+wasi-snapshot-preview1"

View File

@ -12,3 +12,5 @@ tokio = { version = "1.27.0", features = ["full"] }
serde_json = "1.0"
serde = { version = "1.0", features = ["derive"]}
url = { version = "2.3.1", features = ["serde"]}
uuid-simd = "0.8.0"
uuid = { version = "1.3.0", features = ["v4", "fast-rng", "serde"] }

View File

@ -8,3 +8,4 @@ tokio.workspace = true
serde_json.workspace = true
serde.workspace = true
url.workspace = true
uuid.workspace = true

View File

@ -4,6 +4,7 @@ use std::fmt;
use tokio::io::AsyncWriteExt;
use tokio::net::TcpStream;
use url::Url;
use uuid::Uuid;
#[derive(Serialize, Deserialize, Debug)]
enum BuildSystem {
@ -62,7 +63,16 @@ struct Command {
subcommand: Subcommand,
features: Option<Vec<String>>,
tag: Tag,
}
#[derive(Serialize, Deserialize)]
struct Message {
uuid: Uuid,
pre_exec: Option<String>,
profile: bool,
command: Command,
repository: Url,
basename: String,
}
#[tokio::main]
@ -75,12 +85,18 @@ async fn main() -> Result<(), Box<dyn Error>> {
subcommand: Subcommand::Build,
features: Some(vec!["one".to_string(), "two".to_string()]),
tag: Tag::Debug,
};
let test_message = Message {
uuid: Uuid::new_v4(),
pre_exec: None,
profile: false,
command: test_command,
repository: Url::parse("https://lib.rs/crates/serde_json").unwrap(),
basename: "serde_json".to_string(),
};
let j = serde_json::to_string(&test_command)?;
let j = serde_json::to_string(&test_message)?;
println!("{}", j);
// Write some data.
stream.write_all(&j.as_bytes()).await?;
Ok(())

View File

@ -8,3 +8,5 @@ tokio.workspace = true
serde_json.workspace = true
serde.workspace = true
url.workspace = true
uuid-simd.workspace = true
uuid.workspace = true

View File

@ -6,6 +6,8 @@ use std::net::SocketAddr;
use tokio::io::{AsyncBufReadExt, AsyncReadExt, AsyncWriteExt, BufReader};
use tokio::net::{TcpListener, TcpStream};
use url::Url;
use uuid::Uuid;
use uuid_simd::UuidExt;
#[derive(Serialize, Deserialize, Debug)]
enum BuildSystem {
@ -64,42 +66,73 @@ struct Command {
subcommand: Subcommand,
features: Option<Vec<String>>,
tag: Tag,
}
#[derive(Serialize, Deserialize)]
struct Message {
uuid: Uuid,
pre_exec: Option<String>,
profile: bool,
command: Command,
repository: Url,
basename: String,
}
async fn build(msg: Message, address: SocketAddr) {
let mut features = String::new();
match msg.command.features {
Some(f) => {
features.push_str("--features '");
for i in f {
features.push_str(&i);
features.push_str(" ");
}
features.push_str("'");
}
None => features = "".to_string(),
}
println!(
"Received message from {:?}: {}",
address,
msg.uuid.format_hyphenated()
);
println!("git clone {}", msg.repository);
match msg.pre_exec {
Some(e) => println!("Running pre-exec: {}", e),
None => {}
}
println!(
"{} {} {} {}",
msg.command.build_system, msg.command.subcommand, msg.command.tag, features
);
}
async fn process_socket(mut socket: TcpStream, address: SocketAddr) {
let (reader, writer) = socket.split();
let mut reader = BufReader::new(reader);
let mut line = String::new();
loop {
let mut reader = BufReader::new(&mut socket);
let mut line = String::new();
let bytes_read = match reader.read_line(&mut line).await {
Ok(b) => b,
Err(e) => return,
};
let json: Command = match serde_json::from_str(&line) {
Ok(v) => v,
Err(e) => return,
};
let mut features = String::new();
match json.features {
Some(f) => {
features.push_str("--features '");
for i in f {
features.push_str(&i);
features.push_str(" ");
}
features.push_str("'");
}
None => features = "".to_string(),
let bytes_read = reader.read_line(&mut line).await.unwrap();
if bytes_read == 0 {
break;
}
println!(
"Received message from {:?}: {} {} {} {}",
address, json.build_system, json.subcommand, json.tag, features
);
// socket.write_all(&line.as_bytes()).await.unwrap();
let json: Message = match serde_json::from_str(&line) {
Ok(v) => v,
Err(e) => {
eprintln!("{}", e);
return;
}
};
tokio::spawn(async move {
build(json, address).await;
});
}
// println!("client {:?} sent message: '{:?}'", address,);
}
#[tokio::main]