From cd4091f64dc003e1236610d34b06cf300b4eaff5 Mon Sep 17 00:00:00 2001 From: Alex Orlenko Date: Tue, 10 Dec 2024 23:35:39 +0000 Subject: [PATCH] Allow exhaustive match on `Value`. It was not possible because `ValueRef` variant in `Value::Other` was private. Closes #502 and #503 --- src/types/value_ref.rs | 2 +- src/value.rs | 3 +-- tests/value.rs | 22 ++++++++++++++++++++++ 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/src/types/value_ref.rs b/src/types/value_ref.rs index 89a60ec..89bac54 100644 --- a/src/types/value_ref.rs +++ b/src/types/value_ref.rs @@ -4,7 +4,7 @@ use std::os::raw::{c_int, c_void}; use crate::state::{RawLua, WeakLua}; /// A reference to a Lua (complex) value stored in the Lua auxiliary thread. -pub(crate) struct ValueRef { +pub struct ValueRef { pub(crate) lua: WeakLua, pub(crate) index: c_int, pub(crate) drop: bool, diff --git a/src/value.rs b/src/value.rs index 6c81ee5..9292261 100644 --- a/src/value.rs +++ b/src/value.rs @@ -67,8 +67,7 @@ pub enum Value { /// `Error` is a special builtin userdata type. When received from Lua it is implicitly cloned. Error(Box), /// Any other value not known to mlua (eg. LuaJIT CData). - #[allow(private_interfaces)] - Other(ValueRef), + Other(#[doc(hidden)] ValueRef), } pub use self::Value::Nil; diff --git a/tests/value.rs b/tests/value.rs index 98fc222..4185442 100644 --- a/tests/value.rs +++ b/tests/value.rs @@ -296,3 +296,25 @@ fn test_value_conversions() -> Result<()> { Ok(()) } + +#[test] +fn test_value_exhaustive_match() { + match Value::Nil { + Value::Nil => {} + Value::Boolean(_) => {} + Value::LightUserData(_) => {} + Value::Integer(_) => {} + Value::Number(_) => {} + #[cfg(feature = "luau")] + Value::Vector(_) => {} + Value::String(_) => {} + Value::Table(_) => {} + Value::Function(_) => {} + Value::Thread(_) => {} + Value::UserData(_) => {} + #[cfg(feature = "luau")] + Value::Buffer(_) => {} + Value::Error(_) => {} + Value::Other(_) => {} + } +}