From 7d487d53d81d8095c4fd9128f848e0bde47427b5 Mon Sep 17 00:00:00 2001
From: Jason Volk <jason@zemos.net>
Date: Wed, 24 Jul 2024 03:55:01 +0000
Subject: [PATCH] de-cycle conduit_macros from conduit_core.

Signed-off-by: Jason Volk <jason@zemos.net>
---
 Cargo.lock            |  1 -
 src/macros/Cargo.toml |  1 -
 src/macros/admin.rs   |  3 ++-
 src/macros/mod.rs     |  1 +
 src/macros/utils.rs   | 25 +++++++++++++++++++++++++
 5 files changed, 28 insertions(+), 3 deletions(-)
 create mode 100644 src/macros/utils.rs

diff --git a/Cargo.lock b/Cargo.lock
index 0649f3be1..71d79adb8 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -717,7 +717,6 @@ dependencies = [
 name = "conduit_macros"
 version = "0.4.5"
 dependencies = [
- "conduit_core",
  "proc-macro2",
  "quote",
  "syn 1.0.109",
diff --git a/src/macros/Cargo.toml b/src/macros/Cargo.toml
index b9a35aab7..ca98f169e 100644
--- a/src/macros/Cargo.toml
+++ b/src/macros/Cargo.toml
@@ -18,7 +18,6 @@ proc-macro = true
 syn.workspace = true
 quote.workspace = true
 proc-macro2.workspace = true
-conduit-core.workspace = true
 
 [lints]
 workspace = true
diff --git a/src/macros/admin.rs b/src/macros/admin.rs
index a1a5b22ae..e1d294b91 100644
--- a/src/macros/admin.rs
+++ b/src/macros/admin.rs
@@ -1,9 +1,10 @@
-use conduit_core::utils::string::camel_to_snake_string;
 use proc_macro::{Span, TokenStream};
 use proc_macro2::TokenStream as TokenStream2;
 use quote::quote;
 use syn::{parse_macro_input, AttributeArgs, Fields, Ident, ItemEnum, Variant};
 
+use crate::utils::camel_to_snake_string;
+
 pub(super) fn command_dispatch(args: TokenStream, input_: TokenStream) -> TokenStream {
 	let input = input_.clone();
 	let item = parse_macro_input!(input as ItemEnum);
diff --git a/src/macros/mod.rs b/src/macros/mod.rs
index 0aba7560e..6f286d66d 100644
--- a/src/macros/mod.rs
+++ b/src/macros/mod.rs
@@ -1,4 +1,5 @@
 mod admin;
+mod utils;
 
 use proc_macro::TokenStream;
 
diff --git a/src/macros/utils.rs b/src/macros/utils.rs
new file mode 100644
index 000000000..f512c56c2
--- /dev/null
+++ b/src/macros/utils.rs
@@ -0,0 +1,25 @@
+#[must_use]
+pub(crate) fn camel_to_snake_string(s: &str) -> String {
+	let mut output = String::with_capacity(
+		s.chars()
+			.fold(s.len(), |a, ch| a.saturating_add(usize::from(ch.is_ascii_uppercase()))),
+	);
+
+	let mut state = false;
+	s.chars().for_each(|ch| {
+		let m = ch.is_ascii_uppercase();
+		let s = exchange(&mut state, !m);
+		if m && s {
+			output.push('_');
+		}
+		output.push(ch.to_ascii_lowercase());
+	});
+
+	output
+}
+
+pub(crate) fn exchange<T: Clone>(state: &mut T, source: T) -> T {
+	let ret = state.clone();
+	*state = source;
+	ret
+}
-- 
GitLab