Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 15 additions & 14 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

9 changes: 8 additions & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,10 +1,17 @@
[workspace]
resolver = "2"
members = [
"wslplugins-sys",
"plugin",
"wslplugins-rs",
"wslplugins-macro",
"wslplugins-macro-core",
"wslplugins-macro-tests",
]

[workspace.package]
authors = ["Mickaël Véril <mika.veril@wanadoo.fr>"]
version = "0.1.0-alpha.0"
edition = "2021"
license = "MIT"
repository = "https://github.com/mveril/wslplugins-rs"
description = "A Rust framework for developing WSL plugins using safe and idiomatic Rust."
6 changes: 4 additions & 2 deletions plugin/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
[package]
name = "plugin"
version = "0.1.0-alpha.0"
authors = ["Mickaël Véril <mika.veril@wanadoo.fr>"]
authors.workspace = true
version.workspace = true
license.workspace = true
repository.workspace = true
edition = "2021"

[lib]
Expand Down
8 changes: 5 additions & 3 deletions wslplugins-macro-core/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
[package]
name = "wslplugins-macro-core"
version = "0.1.0-alpha.0"
authors = ["Mickaël Véril <mika.veril@wanadoo.fr>"]
authors.workspace = true
version.workspace = true
license.workspace = true
repository.workspace = true
edition = "2021"

[dependencies]
Expand All @@ -12,7 +14,7 @@ heck = "0.5"
strum = { version = "0.26.3", features = ["derive"] }

[build-dependencies]
wslplugins-sys = { path = "../wslplugins-sys", features = [
wslpluginapi-sys = { git = "https://github.com/mveril/wslpluginapi-sys.git", branch = "main", features = [
"hooks-field-names",
] }
quote = "*"
Expand Down
2 changes: 1 addition & 1 deletion wslplugins-macro-core/build.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use std::{env, fs::File, io::Write, path::PathBuf};
use struct_field_names_as_array::FieldNamesAsSlice;
use wslplugins_sys::WSLPluginHooksV1;
use wslpluginapi_sys::WSLPluginHooksV1;

fn main() -> Result<(), Box<dyn std::error::Error>> {
let items: &'static [&'static str] = WSLPluginHooksV1::FIELD_NAMES_AS_SLICE;
Expand Down
9 changes: 6 additions & 3 deletions wslplugins-macro-tests/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
[package]
name = "wslplugins-macro-tests"
version = "0.1.0-alpha.0"
authors = ["Mickaël Véril <mika.veril@wanadoo.fr>"]
authors.workspace = true
version.workspace = true
license.workspace = true
repository.workspace = true
description = "A Rust framework for developing WSL plugins using safe and idiomatic Rust."
edition = "2021"

[dependencies]
wslplugins-rs = { path = "../wslplugins-rs", features = ["macro"] }
wslplugins-sys = { path = "../wslplugins-sys" }
wslpluginapi-sys = { git = "https://github.com/mveril/wslpluginapi-sys.git", branch = "main" }
[dependencies.windows]
version = "0.58"
features = ["Win32_Foundation"]
Expand Down
7 changes: 5 additions & 2 deletions wslplugins-macro/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
[package]
name = "wslplugins-macro"
version = "0.1.0-alpha.0"
authors = ["Mickaël Véril <mika.veril@wanadoo.fr>"]
authors.workspace = true
version.workspace = true
license.workspace = true
repository.workspace = true
edition = "2021"

[lib]
proc-macro = true

Expand Down
9 changes: 6 additions & 3 deletions wslplugins-rs/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
[package]
name = "wslplugins-rs"
version = "0.1.0-alpha.0"
authors = ["Mickaël Véril <mika.veril@wanadoo.fr>"]
authors.workspace = true
version.workspace = true
license.workspace = true
repository.workspace = true
description.workspace = true
edition = "2021"

[dependencies.windows]
Expand All @@ -18,7 +21,7 @@ thiserror = "2.0.7"
typed-path = ">0.1"
widestring = { version = "1", features = ["alloc"] }
wslplugins-macro = { path = "../wslplugins-macro", optional = true }
wslplugins-sys = { path = "../wslplugins-sys" }
wslpluginapi-sys = { git = "https://github.com/mveril/wslpluginapi-sys.git", branch = "main" }

[dependencies.semver]
version = ">0.1"
Expand Down
7 changes: 4 additions & 3 deletions wslplugins-rs/src/api/api_v1.rs
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
extern crate wslplugins_sys;
extern crate wslpluginapi_sys;
#[cfg(doc)]
use super::Error;
use super::Result;
use crate::api::errors::require_update_error::Result as UpReqResult;
use crate::cstring_ext::CstringExt;
use crate::wsl_session_information::WSLSessionInformation;
use crate::WSLVersion;
#[cfg(feature = "log-instrument")]
use log_instrument::instrument;
use std::ffi::{CString, OsStr};
Expand All @@ -23,7 +24,7 @@ use windows::{
Win32::Foundation::BOOL,
};

use wslplugins_sys::{WSLPluginAPIV1, WSLVersion};
use wslpluginapi_sys::WSLPluginAPIV1;

use super::utils::check_required_version_result;

Expand Down Expand Up @@ -72,7 +73,7 @@ impl ApiV1 {
/// );
#[cfg_attr(feature = "log-instrument", instrument)]
pub fn version(&self) -> &WSLVersion {
&self.0.Version
self.0.Version.as_ref()
}

/// Create plan9 mount between Windows & Linux
Expand Down
2 changes: 1 addition & 1 deletion wslplugins-rs/src/api/errors.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ use thiserror::Error;
pub mod require_update_error;
pub use require_update_error::Error as RequireUpdateError;
use windows::core::{Error as WinError, HRESULT};
use wslplugins_sys::WSL_E_PLUGIN_REQUIRES_UPDATE;
use wslpluginapi_sys::WSL_E_PLUGIN_REQUIRES_UPDATE;

/// A comprehensive error type for WSL plugins.
///
Expand Down
3 changes: 2 additions & 1 deletion wslplugins-rs/src/api/errors/require_update_error.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,10 @@
//! does not meet the required version. It integrates with Windows error codes for seamless interop
//! with WSL APIs.

use crate::WSLVersion;
use thiserror::Error;
use windows::core::HRESULT;
use wslplugins_sys::{WSLVersion, WSL_E_PLUGIN_REQUIRES_UPDATE};
use wslpluginapi_sys::WSL_E_PLUGIN_REQUIRES_UPDATE;

/// Represents an error when the current WSL version is unsupported.
///
Expand Down
8 changes: 4 additions & 4 deletions wslplugins-rs/src/api/utils.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

use super::errors::require_update_error::{Error, Result};
use crate::WSLContext;
use wslplugins_sys::WSLVersion;
use crate::WSLVersion;

pub(crate) fn check_required_version_result(
current_version: &WSLVersion,
Expand All @@ -15,8 +15,8 @@ pub(crate) fn check_required_version_result(
Ok(())
} else {
Err(Error {
current_version: *current_version,
required_version: *required_version,
current_version: current_version.clone(),
required_version: required_version.clone(),
})
}
}
Expand All @@ -36,7 +36,7 @@ pub(crate) fn check_required_version_result_from_context(
#[cfg(test)]
mod tests {
use super::*;
use wslplugins_sys::WSLVersion;
use crate::WSLVersion;

/// Tests that `check_required_version_result` returns `Ok` when the current version meets the requirement.
#[test]
Expand Down
23 changes: 12 additions & 11 deletions wslplugins-rs/src/distribution_information.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,51 +12,51 @@
//! - Process ID (PID) of the init process (requires API version 2.0.5 or higher)
//! - PID namespace

extern crate wslplugins_sys;
extern crate wslpluginapi_sys;
#[cfg(doc)]
use crate::api::errors::require_update_error::Error;
use crate::api::{
errors::require_update_error::Result, utils::check_required_version_result_from_context,
};
use crate::core_distribution_information::CoreDistributionInformation;
use crate::WSLContext;
use crate::WSLVersion;
use std::ffi::OsString;
use std::fmt::{Debug, Display};
use std::hash::Hash;
use std::os::windows::ffi::OsStringExt;
use windows::core::GUID;
use wslplugins_sys::WSLVersion;

/// Represents detailed information about a WSL distribution.
///
/// This struct wraps the `WSLDistributionInformation` from the WSL Plugin API and provides
/// safe, idiomatic Rust access to its fields.
#[repr(transparent)]
pub struct DistributionInformation(wslplugins_sys::WSLDistributionInformation);
pub struct DistributionInformation(wslpluginapi_sys::WSLDistributionInformation);

impl AsRef<DistributionInformation> for wslplugins_sys::WSLDistributionInformation {
impl AsRef<DistributionInformation> for wslpluginapi_sys::WSLDistributionInformation {
fn as_ref(&self) -> &DistributionInformation {
unsafe {
&*(self as *const wslplugins_sys::WSLDistributionInformation
&*(self as *const wslpluginapi_sys::WSLDistributionInformation
as *const DistributionInformation)
}
}
}

impl From<DistributionInformation> for wslplugins_sys::WSLDistributionInformation {
impl From<DistributionInformation> for wslpluginapi_sys::WSLDistributionInformation {
fn from(value: DistributionInformation) -> Self {
value.0
}
}

impl AsRef<wslplugins_sys::WSLDistributionInformation> for DistributionInformation {
fn as_ref(&self) -> &wslplugins_sys::WSLDistributionInformation {
impl AsRef<wslpluginapi_sys::WSLDistributionInformation> for DistributionInformation {
fn as_ref(&self) -> &wslpluginapi_sys::WSLDistributionInformation {
&self.0
}
}

impl From<wslplugins_sys::WSLDistributionInformation> for DistributionInformation {
fn from(value: wslplugins_sys::WSLDistributionInformation) -> Self {
impl From<wslpluginapi_sys::WSLDistributionInformation> for DistributionInformation {
fn from(value: wslpluginapi_sys::WSLDistributionInformation) -> Self {
DistributionInformation(value)
}
}
Expand Down Expand Up @@ -179,6 +179,7 @@ mod tests {

#[test]
fn test_layouts() {
test_transparence::<wslplugins_sys::WSLDistributionInformation, DistributionInformation>();
test_transparence::<wslpluginapi_sys::WSLDistributionInformation, DistributionInformation>(
);
}
}
6 changes: 4 additions & 2 deletions wslplugins-rs/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -62,12 +62,14 @@ pub use offline_distribution_information::OfflineDistributionInformation;
pub use wsl_context::WSLContext;
pub use wsl_session_information::WSLSessionInformation;
pub use wsl_vm_creation_settings::WSLVmCreationSettings;
mod wsl_version;
pub use wsl_version::WSLVersion;

/// Re-exports procedural macros when the `macro` feature is enabled.
/// It allow to mark a plugin struct (that implement [WSLPluginV1] trait) to be easely integrated to the WSL plugin system without writing manually C code for entry point or hooks.
#[cfg(feature = "macro")]
pub use wslplugins_macro::wsl_plugin_v1;

/// Re-exports the `wslplugins_sys` crate as `sys` when the `sys` feature is enabled.
/// Re-exports the `wslpluginapi_sys` crate as `sys` when the `sys` feature is enabled.
#[cfg(feature = "sys")]
pub use wslplugins_sys as sys;
pub use wslpluginapi_sys as sys;
20 changes: 10 additions & 10 deletions wslplugins-rs/src/offline_distribution_information.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
//! This module provides an abstraction over `WslOfflineDistributionInformation` from the WSL Plugin API,
//! offering a safe and idiomatic Rust interface for accessing offline distribution details.

extern crate wslplugins_sys;
extern crate wslpluginapi_sys;
use crate::core_distribution_information::CoreDistributionInformation;
use std::{
ffi::OsString,
Expand All @@ -18,30 +18,30 @@ use windows::core::GUID;
/// This struct allows access to the details of an offline WSL distribution, including
/// its ID, name, and optional package family name.
#[repr(transparent)]
pub struct OfflineDistributionInformation(wslplugins_sys::WslOfflineDistributionInformation);
pub struct OfflineDistributionInformation(wslpluginapi_sys::WslOfflineDistributionInformation);

impl From<OfflineDistributionInformation> for wslplugins_sys::WslOfflineDistributionInformation {
impl From<OfflineDistributionInformation> for wslpluginapi_sys::WslOfflineDistributionInformation {
fn from(value: OfflineDistributionInformation) -> Self {
value.0
}
}

impl From<wslplugins_sys::WslOfflineDistributionInformation> for OfflineDistributionInformation {
fn from(value: wslplugins_sys::WslOfflineDistributionInformation) -> Self {
impl From<wslpluginapi_sys::WslOfflineDistributionInformation> for OfflineDistributionInformation {
fn from(value: wslpluginapi_sys::WslOfflineDistributionInformation) -> Self {
OfflineDistributionInformation(value)
}
}

impl AsRef<wslplugins_sys::WslOfflineDistributionInformation> for OfflineDistributionInformation {
fn as_ref(&self) -> &wslplugins_sys::WslOfflineDistributionInformation {
impl AsRef<wslpluginapi_sys::WslOfflineDistributionInformation> for OfflineDistributionInformation {
fn as_ref(&self) -> &wslpluginapi_sys::WslOfflineDistributionInformation {
&self.0
}
}

impl AsRef<OfflineDistributionInformation> for wslplugins_sys::WslOfflineDistributionInformation {
impl AsRef<OfflineDistributionInformation> for wslpluginapi_sys::WslOfflineDistributionInformation {
fn as_ref(&self) -> &OfflineDistributionInformation {
unsafe {
&*(self as *const wslplugins_sys::WslOfflineDistributionInformation
&*(self as *const wslpluginapi_sys::WslOfflineDistributionInformation
as *const OfflineDistributionInformation)
}
}
Expand Down Expand Up @@ -122,7 +122,7 @@ mod tests {
#[test]
fn test_layouts() {
test_transparence::<
wslplugins_sys::WslOfflineDistributionInformation,
wslpluginapi_sys::WslOfflineDistributionInformation,
OfflineDistributionInformation,
>();
}
Expand Down
Loading