From 5a206da10261bfb3d250605b51b36f27d5c1d0f2 Mon Sep 17 00:00:00 2001 From: AN Long Date: Sun, 24 Aug 2025 18:13:22 +0900 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20Allow=20get=20with=20flags=20with?= =?UTF-8?q?=20various=20types?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/ci.yaml | 1 + src/value.rs | 13 ++++++++++++ tests/test_ascii.rs | 43 ++++++++++++++++++++++++++++++++++++++ tests/tests.rs | 44 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 101 insertions(+) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index caecc4b..c7fc885 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -37,3 +37,4 @@ jobs: uses: actions-rs/cargo@v1 with: command: test + args: -- --test-threads=1 diff --git a/src/value.rs b/src/value.rs index 2f33966..86865c2 100644 --- a/src/value.rs +++ b/src/value.rs @@ -148,6 +148,12 @@ impl FromMemcacheValue for Vec { } } +impl FromMemcacheValue for (String, u32) { + fn from_memcache_value(value: Vec, flags: u32) -> MemcacheValue { + return Ok((String::from_utf8(value)?, flags)); + } +} + impl FromMemcacheValue for String { fn from_memcache_value(value: Vec, _: u32) -> MemcacheValue { return Ok(String::from_utf8(value)?); @@ -162,6 +168,13 @@ macro_rules! impl_from_memcache_value_for_number { Ok(Self::from_str(s.as_str())?) } } + + impl FromMemcacheValue for ($ty, u32) { + fn from_memcache_value(value: Vec, flags: u32) -> MemcacheValue { + let s: String = FromMemcacheValue::from_memcache_value(value, 0)?; + Ok(($ty::from_str(s.as_str())?, flags)) + } + } }; } diff --git a/tests/test_ascii.rs b/tests/test_ascii.rs index 64fef61..431b66d 100644 --- a/tests/test_ascii.rs +++ b/tests/test_ascii.rs @@ -47,3 +47,46 @@ fn test_ascii() { client.stats().unwrap(); } + +#[test] +fn test_get_with_flags() { + use memcache::ToMemcacheValue; + use std::io::Write; + + let client = memcache::Client::connect("memcache://localhost:12345?protocol=ascii").unwrap(); + client.flush().unwrap(); + + // Create a custom value with specific flags for testing + struct TestValue { + data: Vec, + flags: u32, + } + + impl ToMemcacheValue for TestValue { + fn get_flags(&self) -> u32 { + self.flags + } + + fn get_length(&self) -> usize { + self.data.len() + } + + fn write_to(&self, stream: &mut W) -> std::io::Result<()> { + stream.write_all(&self.data) + } + } + + // Test with custom flags + let test_value = TestValue { + data: b"test_value".to_vec(), + flags: 114514, + }; + + client.set("test_key", test_value, 0).unwrap(); + + // Test our new FromMemcacheValue implementation + let value: Option<(String, u32)> = client.get("test_key").unwrap(); + assert_eq!(value, Some(("test_value".to_string(), 114514))); + + client.flush().unwrap(); +} diff --git a/tests/tests.rs b/tests/tests.rs index 947084b..e8096c5 100644 --- a/tests/tests.rs +++ b/tests/tests.rs @@ -250,3 +250,47 @@ fn test_cas() { client.flush().unwrap(); } } + +#[test] +fn test_get_with_flags() { + use memcache::Client; + use memcache::ToMemcacheValue; + use std::io::Write; + + let client = Client::connect("memcache://localhost:12345").unwrap(); + client.flush().unwrap(); + + // Create a custom value with specific flags for testing + struct TestValue { + data: Vec, + flags: u32, + } + + impl ToMemcacheValue for TestValue { + fn get_flags(&self) -> u32 { + self.flags + } + + fn get_length(&self) -> usize { + self.data.len() + } + + fn write_to(&self, stream: &mut W) -> std::io::Result<()> { + stream.write_all(&self.data) + } + } + + // Test with custom flags + let test_value = TestValue { + data: b"test_value".to_vec(), + flags: 114514, + }; + + client.set("test_key", test_value, 0).unwrap(); + + // Test our new FromMemcacheValue implementation + let value: Option<(String, u32)> = client.get("test_key").unwrap(); + assert_eq!(value, Some(("test_value".to_string(), 114514))); + + client.flush().unwrap(); +}