From bfeb88339bfe3445b63e25ea07ee2a028c298135 Mon Sep 17 00:00:00 2001 From: Summpot Date: Thu, 13 Jun 2024 18:23:49 +0800 Subject: [PATCH 1/2] Updating dependencies --- Cargo.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 0c627c5..7c8d141 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -22,8 +22,8 @@ crate-type = ["cdylib"] [dependencies] serde = { version = "1.0.103", features = ["derive"] } serde_json = "1.0" -toml = "0.5.2" -cargo_metadata = "0.9.0" +toml = "0.8.14" +cargo_metadata = "0.18.1" [dev-dependencies] dlopen = "0.1.8" From c0a905b496ced6ce26b88b5038c2eb0fd21c70cf Mon Sep 17 00:00:00 2001 From: Summpot Date: Thu, 13 Jun 2024 19:08:13 +0800 Subject: [PATCH 2/2] Check for the presence of cdylib in artifacts --- src/cargo.rs | 20 ++++++++++++++++---- src/error.rs | 4 ++++ 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/cargo.rs b/src/cargo.rs index d5bcaf8..14f127b 100644 --- a/src/cargo.rs +++ b/src/cargo.rs @@ -1,5 +1,7 @@ use cargo_metadata::Message; use serde::Deserialize; +use serde_json::Map; +use std::io::{BufReader, Cursor}; use std::path::PathBuf; use std::process::{Command, Output, Stdio}; @@ -73,7 +75,7 @@ pub fn build_example(name: &str) -> Result { pub fn parse_output(result: Output) -> Result { let mut artifact = None; - for message in cargo_metadata::parse_messages(result.stdout.as_slice()) { + for message in Message::parse_stream(Cursor::new(result.stdout)) { match message? { Message::CompilerMessage(m) => eprintln!("{}", m), Message::CompilerArtifact(a) => artifact = Some(a), @@ -84,9 +86,19 @@ pub fn parse_output(result: Output) -> Result { if !result.status.success() { return Err(Error::CargoFail); } - artifact - .ok_or(Error::CargoFail) - .map(|a| a.filenames[0].clone()) + match artifact { + Some(artifact) => artifact + .filenames + .into_iter() + .filter(|filename| match filename.extension() { + Some("dll") | Some("dylib") | Some("so") => true, + _ => false, + }) + .next() + .ok_or(Error::CdylibNotFound) + .map(|a| a.into_std_path_buf()), + None => Err(Error::CargoFail), + } } pub fn metadata() -> Result { diff --git a/src/error.rs b/src/error.rs index 6eb7b76..e7832bc 100644 --- a/src/error.rs +++ b/src/error.rs @@ -15,6 +15,7 @@ pub enum Error { TomlDe(toml::de::Error), TomlSer(toml::ser::Error), Json(serde_json::Error), + CdylibNotFound, } pub type Result = std::result::Result; @@ -34,6 +35,9 @@ impl Display for Error { TomlDe(e) => e.fmt(f), TomlSer(e) => e.fmt(f), Json(e) => e.fmt(f), + CdylibNotFound => { + write!(f, "can't find cdylib(.dll,.so,.cdylib) in output dir, please check that you have set [crate-type] correctly in Cargo.toml") + } } } }