From 38ff6f1369b594709a03e4a32fe024f09d3eb6a7 Mon Sep 17 00:00:00 2001 From: wandalen Date: Sun, 6 Apr 2025 00:58:31 +0300 Subject: [PATCH 1/7] llm_tools : evolve messaging --- Cargo.toml | 21 ++ module/move/llm_tools/Cargo.toml | 23 +- module/move/llm_tools/src/bin/main.rs | 20 +- module/move/llm_tools/src/lib.rs | 2 + module/move/llm_tools/src/messaging.rs | 389 +++++++++++++++++++++++++ module/move/llm_tools/src/secret.rs | 10 +- 6 files changed, 445 insertions(+), 20 deletions(-) create mode 100644 module/move/llm_tools/src/messaging.rs diff --git a/Cargo.toml b/Cargo.toml index 1b95384bd0..a12fceb81a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -592,3 +592,24 @@ version = "0.8.5" [workspace.dependencies.trybuild] version = "1.0.85" + +[workspace.dependencies.futures-core] +version = "0.3.31" + +[workspace.dependencies.futures-util] +version = "0.3.31" + +[workspace.dependencies.regex] +version = "1.11.1" + +[workspace.dependencies.serde] +version = "1.0.219" + +[workspace.dependencies.serde_with] +version = "3.12.0" + +[workspace.dependencies.serde_json] +version = "1.0.140" + +[workspace.dependencies.serde_yaml] +version = "0.9.34" diff --git a/module/move/llm_tools/Cargo.toml b/module/move/llm_tools/Cargo.toml index 325482a155..29181fcfa0 100644 --- a/module/move/llm_tools/Cargo.toml +++ b/module/move/llm_tools/Cargo.toml @@ -49,14 +49,29 @@ dotenv = "0.15" # clap = { version = "4.5.20", features = ["derive"] } # pth = "0.21.0" pth = { workspace = true, features = [ "full" ] } -serde = { version = "1.0.213", features = ["derive"] } -serde_with = "3.11.0" +# serde = { version = "1.0.213", features = ["derive"] } +# serde_with = "3.11.0" # error_tools = "0.17.0" error_tools = { workspace = true, features = [ "full" ] } derive_tools = { workspace = true, features = ["full"] } # derive_tools = { version = "0.32.0", features = ["full"] } -regex = { version = "1.10.3" } -serde_yaml = "0.9" +# regex = { version = "1.10.3" } +# serde_yaml = "0.9" + +# regex = { version = "1.10.3" } +# serde = { version = "1.0.219", features = ["derive"] } +# serde_with = { version = "3.12.0" } +# serde_json = { version = "1.0.140" } +# serde_yaml = { version = "0.9.34" } + +regex = { workspace = true } +serde = { workspace = true, features = ["derive"] } +serde_with = { workspace = true } +serde_json = { workspace = true } +serde_yaml = { workspace = true } + +futures-core = { workspace = true } +futures-util = { workspace = true } [dev-dependencies] test_tools = { workspace = true } diff --git a/module/move/llm_tools/src/bin/main.rs b/module/move/llm_tools/src/bin/main.rs index 3b4ab6bd22..fc284b794a 100644 --- a/module/move/llm_tools/src/bin/main.rs +++ b/module/move/llm_tools/src/bin/main.rs @@ -29,7 +29,6 @@ async fn main() -> Result< (), Box< dyn Error > > dotenv().ok(); let secret = Secret::load()?; - let client = client( &secret )?; let response = client.file_list().await?; @@ -41,15 +40,14 @@ async fn main() -> Result< (), Box< dyn Error > > AsTable::new( &files ).table_to_string_with_format( &output_format::Table::default() ), ); - let response = client.list_assistant( None, None, None, None ).await?; - - // println!( "Assistants: {:?}", assistants.data ); - let assistants : Vec< _ > = response.data.into_iter().map( | e | llm_tools::AssistantObjectWrap( e ) ).collect(); - println! - ( - "Assistants:\n{}", - AsTable::new( &assistants ).table_to_string_with_format( &output_format::Records::default() ), - ); + // let response = client.list_assistant( None, None, None, None ).await?; + // // println!( "Assistants: {:?}", assistants.data ); + // let assistants : Vec< _ > = response.data.into_iter().map( | e | llm_tools::AssistantObjectWrap( e ) ).collect(); + // println! + // ( + // "Assistants:\n{}", + // AsTable::new( &assistants ).table_to_string_with_format( &output_format::Records::default() ), + // ); Ok( () ) -} \ No newline at end of file +} diff --git a/module/move/llm_tools/src/lib.rs b/module/move/llm_tools/src/lib.rs index 7299b5df2f..88d27ffd1d 100644 --- a/module/move/llm_tools/src/lib.rs +++ b/module/move/llm_tools/src/lib.rs @@ -28,6 +28,8 @@ crate::mod_interface! { layer client; + layer messaging; + layer debug; layer secret; layer util; diff --git a/module/move/llm_tools/src/messaging.rs b/module/move/llm_tools/src/messaging.rs new file mode 100644 index 0000000000..e4667af714 --- /dev/null +++ b/module/move/llm_tools/src/messaging.rs @@ -0,0 +1,389 @@ +//! Messaging. + +mod private +{ + use std:: + { + any::Any, + collections::HashMap, + ops::{ Deref, DerefMut }, + pin::Pin, + task::{ Context, Poll }, + }; + + use futures_core:: + { + future::BoxFuture, + stream::Stream, + }; + + /// Represents potential errors that may occur during LLM invocations. + #[derive(Debug)] + pub enum LlmError + { + /// Catch-all variant for unknown or miscellaneous errors. + Unknown( String ), + } + + /// Alias for JSON-based values commonly used for LLM parameters. + pub type Value = serde_json::Value; + + /// A trait defining the behaviors of a generated message from the LLM. + /// + /// Different LLM backends can implement this in various ways to handle + /// partial streaming, token counting, or advanced metadata. + pub trait MessageGenerated: std::fmt::Debug + Send + Sync + { + /// Exposes a method for downcasting implementations if needed. + fn as_any( &self ) -> &dyn Any; + + /// Retrieves the number of tokens used so far, if known. + fn tokens_used( &self ) -> Option; + + /// Retrieves the model identifier, if known. + fn model( &self ) -> Option< &str >; + + /// Asynchronously waits for message generation to complete. + fn wait_for_completion< 'a >( &'a mut self ) -> BoxFuture< 'a, Result< (), LlmError > >; + + /// Provides a stream of partial outputs (tokens, chunks, etc.), if available. + fn partial_stream< 'a >( &'a mut self ) -> Pin< Box< dyn Stream< Item = String > + 'a + Send > >; + } + + /// A default-like implementation of the generation object. + /// + /// This example doesn't truly stream anything, but it showcases how you can + /// store metadata and optionally produce partial content. + #[derive(Debug, Clone)] + pub struct MessageGeneration + { + /// The total number of tokens used for generation, if known. + pub tokens_used_val : Option, + /// The model used to generate this message, if known. + pub model_name : Option, + /// Whether the generation is considered final/complete. + pub complete : bool, + /// A queue of partial tokens or chunks for streaming (mocked). + pub partial_content : Vec, + } + + impl MessageGeneration + { + /// Creates a new generator with optional known tokens_used/model. + pub fn new( tokens_used : Option, model : Option ) -> Self + { + Self + { + tokens_used_val : tokens_used, + model_name : model, + complete : true, + partial_content : Vec::new(), + } + } + } + + impl MessageGenerated for MessageGeneration + { + fn as_any( &self ) -> &dyn Any + { + self + } + + fn tokens_used( &self ) -> Option + { + self.tokens_used_val + } + + fn model( &self ) -> Option< &str > + { + self.model_name.as_deref() + } + + fn wait_for_completion< 'a >( &'a mut self ) -> BoxFuture< 'a, Result< (), LlmError > > + { + Box::pin( async move + { + // In a real implementation, you might poll an API or + // wait on a background task. Here, we do nothing. + self.complete = true; + Ok(()) + }) + } + + fn partial_stream< 'a >( &'a mut self ) -> Pin< Box< dyn Stream< Item = String > + 'a + Send > > + { + // Transform the stored partial_content into a simple stream of strings. + let iter = self.partial_content.drain(..); + Box::pin( futures_util::stream::iter( iter ) ) + } + } + + /// Represents a single message in a conversation, either from a user or an assistant. + /// + /// It can optionally contain a dynamically-dispatched object that provides + /// asynchronous access to the message generation process. + #[derive(Debug)] + pub struct Message + { + /// The role of the message sender (e.g., "user", "assistant"). + pub role : String, + /// A unique identifier for the message, if any. + pub id : Option, + /// The main textual content of the message. + pub content : String, + /// Optional handle to the generation process and metadata. + pub response : Option >, + } + + impl Message + { + /// Creates a new user-level or assistant-level message without generation data. + pub fn new( role : &str, content : &str ) -> Self + { + Self + { + role : role.to_string(), + id : None, + content : content.to_string(), + response : None, + } + } + + /// Creates a new message with the provided generation object. + pub fn with_generation + ( + role : &str, + content : &str, + gen : Box< dyn MessageGenerated > + ) -> Self + { + Self + { + role : role.to_string(), + id : None, + content : content.to_string(), + response : Some( gen ), + } + } + } + + /// A thin wrapper around a vector of messages to store a conversation log. + #[repr(transparent)] + #[derive(Debug)] + pub struct Messages( Vec ); + + impl Messages + { + /// Creates a new, empty list of messages. + pub fn new() -> Self + { + Self( Vec::new() ) + } + } + + impl Deref for Messages + { + type Target = Vec; + + fn deref( &self ) -> &Self::Target + { + &self.0 + } + } + + impl DerefMut for Messages + { + fn deref_mut( &mut self ) -> &mut Self::Target + { + &mut self.0 + } + } + + /// Represents a conversation that holds a series of messages and relevant parameters. + #[derive(Debug)] + pub struct Conversation + { + /// A collection of messages exchanged within this conversation. + messages : Messages, + /// A collection of key-value parameters to customize LLM behavior. + parameters : HashMap< String, Value >, + } + + impl Conversation + { + /// Creates a new empty conversation with no parameters. + pub fn new() -> Self + { + Self + { + messages : Messages::new(), + parameters : HashMap::new(), + } + } + + /// Adds or updates a specific parameter for the LLM. + /// + /// # Arguments + /// + /// * `key` - The name of the parameter (e.g., "temperature"). + /// * `val` - The JSON-based value to store for this parameter. + /// + /// # Errors + /// + /// Returns `Err(LlmError::Unknown(...))` for unexpected conditions. + pub fn parameter_set + ( + &mut self, + key : &str, + val : Value + ) -> Result< (), LlmError > + { + self.parameters.insert( key.to_string(), val ); + Ok(()) + } + + /// Inserts a context (usually from the conversation's system or user) into the conversation log. + /// + /// # Arguments + /// + /// * `context` - A new message describing the context (e.g., system instructions). + /// + /// # Errors + /// + /// Returns `Err(LlmError::Unknown(...))` for unexpected conditions. + pub fn context + ( + &mut self, + context : Message + ) -> Result< (), LlmError > + { + self.messages.push( context ); + Ok(()) + } + + /// Adds a user or assistant message to the conversation. + /// + /// # Arguments + /// + /// * `message` - The new message to append to the conversation log. + /// + /// # Errors + /// + /// Returns `Err(LlmError::Unknown(...))` for unexpected conditions. + pub fn message_add + ( + &mut self, + message : Message + ) -> Result< (), LlmError > + { + self.messages.push( message ); + Ok(()) + } + } + + /// A trait defining asynchronous single-message retrieval from the LLM. + pub trait MessageSend + { + /// Sends the current conversation state to the LLM and returns a single generated message. + /// + /// # Returns + /// + /// The newly generated message (with optional generation object inside), or an error if something went wrong. + // async fn send( &self ) -> Result< Message, LlmError >; + fn send( &self ) -> impl std::future::Future< Output = Result< Message, LlmError > > + Send; + } + + /// A trait defining asynchronous stream-based retrieval from the LLM. + /// + /// The associated type is a Stream of concrete items (MessageGeneration). + pub trait MessageStream + { + /// The type of the asynchronous stream that yields generated results one by one. + type MessagesStream : Stream< Item = MessageGeneration > + Send + 'static; + + /// Sends the current conversation state to the LLM and returns a stream of generated message chunks. + /// + /// # Returns + /// + /// An asynchronous stream of MessageGeneration objects, or an error if something went wrong. + // async fn stream( &self ) -> Result< Self::MessagesStream, LlmError >; + fn stream( &self ) -> impl std::future::Future< Output = Result< Self::MessagesStream, LlmError > > + Send; + } + + impl MessageSend for Conversation + { + async fn send( &self ) -> Result< Message, LlmError > + { + // Example: returning a new message with a generation object + Ok( Message + { + role : "assistant".to_string(), + id : None, + content : "Mocked LLM Response".to_string(), + response : Some( Box::new( MessageGeneration + { + tokens_used_val : Some( 42 ), + model_name : Some( "MockedModel".to_string() ), + complete : true, + partial_content : vec![], + })), + }) + } + } + + /// The concrete stream type that yields MessageGeneration objects. + #[derive(Debug)] + pub struct ConversationGenerationStream + { + gens : std::vec::IntoIter< MessageGeneration >, + } + + impl Stream for ConversationGenerationStream + { + type Item = MessageGeneration; + + fn poll_next + ( + self : Pin<&mut Self>, + _cx : &mut Context<'_> + ) -> Poll< Option< Self::Item > > + { + let me = self.get_mut(); + Poll::Ready( me.gens.next() ) + } + } + + impl MessageStream for Conversation + { + type MessagesStream = ConversationGenerationStream; + + async fn stream( &self ) -> Result< Self::MessagesStream, LlmError > + { + // Gather all the message-generation objects from the conversation. + let mut all = Vec::new(); + for msg in &self.messages.0 + { + if let Some( ref gen ) = msg.response + { + // Attempt to downcast to our concrete MessageGeneration structure. + if let Some( real_gen ) = gen.as_any().downcast_ref::< MessageGeneration >() + { + all.push( real_gen.clone() ); + } + } + } + Ok( ConversationGenerationStream + { + gens : all.into_iter(), + }) + } + } +} + +crate::mod_interface! +{ + own use + { + private::*, + }; +} \ No newline at end of file diff --git a/module/move/llm_tools/src/secret.rs b/module/move/llm_tools/src/secret.rs index aa90da77bc..803a8fc85a 100644 --- a/module/move/llm_tools/src/secret.rs +++ b/module/move/llm_tools/src/secret.rs @@ -25,9 +25,9 @@ mod private /// Secret file is illformed. #[ error( "Secret file is illformed\n{0}" ) ] SecretFileIllformed - ( - #[ from ] - #[ serde_as( as = "DisplayFromStr" ) ] + ( + #[ from ] + #[ serde_as( as = "DisplayFromStr" ) ] dotenv::Error ), @@ -154,7 +154,7 @@ Either define missing environment variable or make sure `./.key/-env.toml` file /// * On failure, returns an error indicating the missing environment variable. fn var ( - name : &'static str, + name : &'static str, default : Option< &'static str >, ) -> Result< String > { @@ -191,7 +191,7 @@ Either define missing environment variable or make sure `./.key/-env.toml` file /// * On failure, returns an error indicating the missing or ill-formed environment variable. fn _var_path ( - name : &'static str, + name : &'static str, default : Option< &'static str >, ) -> Result< pth::AbsolutePath > { From 861d9ad220a30d8fd8c3c6f40838209cf5a38e76 Mon Sep 17 00:00:00 2001 From: wandalen Date: Mon, 7 Apr 2025 07:41:40 +0300 Subject: [PATCH 2/7] llm_tools : evolve --- module/move/llm_tools/Cargo.toml | 15 +--------- module/move/llm_tools/src/messaging.rs | 41 ++++++++++++++++---------- 2 files changed, 26 insertions(+), 30 deletions(-) diff --git a/module/move/llm_tools/Cargo.toml b/module/move/llm_tools/Cargo.toml index 29181fcfa0..68be7a479c 100644 --- a/module/move/llm_tools/Cargo.toml +++ b/module/move/llm_tools/Cargo.toml @@ -38,6 +38,7 @@ name = "main" path = "src/bin/main.rs" [dependencies] + # xxx : qqq : optimze features mod_interface = { workspace = true, features = [ "full" ] } former = { workspace = true, features = [ "full" ] } @@ -46,23 +47,9 @@ reflect_tools = { workspace = true, features = [ "full" ] } openai-api-rs = { version = "=5.0.14" } tokio = { version = "1", features = ["full"] } dotenv = "0.15" -# clap = { version = "4.5.20", features = ["derive"] } -# pth = "0.21.0" pth = { workspace = true, features = [ "full" ] } -# serde = { version = "1.0.213", features = ["derive"] } -# serde_with = "3.11.0" -# error_tools = "0.17.0" error_tools = { workspace = true, features = [ "full" ] } derive_tools = { workspace = true, features = ["full"] } -# derive_tools = { version = "0.32.0", features = ["full"] } -# regex = { version = "1.10.3" } -# serde_yaml = "0.9" - -# regex = { version = "1.10.3" } -# serde = { version = "1.0.219", features = ["derive"] } -# serde_with = { version = "3.12.0" } -# serde_json = { version = "1.0.140" } -# serde_yaml = { version = "0.9.34" } regex = { workspace = true } serde = { workspace = true, features = ["derive"] } diff --git a/module/move/llm_tools/src/messaging.rs b/module/move/llm_tools/src/messaging.rs index e4667af714..39bdbf3349 100644 --- a/module/move/llm_tools/src/messaging.rs +++ b/module/move/llm_tools/src/messaging.rs @@ -18,7 +18,7 @@ mod private }; /// Represents potential errors that may occur during LLM invocations. - #[derive(Debug)] + #[ derive( Debug ) ] pub enum LlmError { /// Catch-all variant for unknown or miscellaneous errors. @@ -58,19 +58,19 @@ mod private pub struct MessageGeneration { /// The total number of tokens used for generation, if known. - pub tokens_used_val : Option, + pub tokens_used_val : Option< u64 >, /// The model used to generate this message, if known. - pub model_name : Option, + pub model_name : Option< String >, /// Whether the generation is considered final/complete. pub complete : bool, /// A queue of partial tokens or chunks for streaming (mocked). - pub partial_content : Vec, + pub partial_content : Vec< String >, } impl MessageGeneration { /// Creates a new generator with optional known tokens_used/model. - pub fn new( tokens_used : Option, model : Option ) -> Self + pub fn new( tokens_used : Option, model : Option< String > ) -> Self { Self { @@ -122,13 +122,13 @@ mod private /// /// It can optionally contain a dynamically-dispatched object that provides /// asynchronous access to the message generation process. - #[derive(Debug)] + #[ derive( Debug ) ] pub struct Message { /// The role of the message sender (e.g., "user", "assistant"). pub role : String, /// A unique identifier for the message, if any. - pub id : Option, + pub id : Option< String >, /// The main textual content of the message. pub content : String, /// Optional handle to the generation process and metadata. @@ -168,8 +168,8 @@ mod private } /// A thin wrapper around a vector of messages to store a conversation log. - #[repr(transparent)] - #[derive(Debug)] + #[ repr( transparent ) ] + #[ derive( Debug ) ] pub struct Messages( Vec ); impl Messages @@ -200,7 +200,7 @@ mod private } /// Represents a conversation that holds a series of messages and relevant parameters. - #[derive(Debug)] + #[ derive( Debug ) ] pub struct Conversation { /// A collection of messages exchanged within this conversation. @@ -230,7 +230,7 @@ mod private /// /// # Errors /// - /// Returns `Err(LlmError::Unknown(...))` for unexpected conditions. + /// Returns `Err( LlmError::Unknown( ...) )` for unexpected conditions. pub fn parameter_set ( &mut self, @@ -250,7 +250,7 @@ mod private /// /// # Errors /// - /// Returns `Err(LlmError::Unknown(...))` for unexpected conditions. + /// Returns `Err( LlmError::Unknown( ... ) )` for unexpected conditions. pub fn context ( &mut self, @@ -269,7 +269,7 @@ mod private /// /// # Errors /// - /// Returns `Err(LlmError::Unknown(...))` for unexpected conditions. + /// Returns `Err( LlmError::Unknown( ... ) )` for unexpected conditions. pub fn message_add ( &mut self, @@ -332,7 +332,7 @@ mod private } /// The concrete stream type that yields MessageGeneration objects. - #[derive(Debug)] + #[ derive( Debug ) ] pub struct ConversationGenerationStream { gens : std::vec::IntoIter< MessageGeneration >, @@ -384,6 +384,15 @@ crate::mod_interface! { own use { - private::*, + private::LlmError, + private::Value, + private::MessageGenerated, + private::MessageGeneration, + private::Message, + private::Messages, + private::Conversation, + private::MessageSend, + private::MessageStream, + private::ConversationGenerationStream, }; -} \ No newline at end of file +} From 1bdf7ba34bddee5b8d39aad1b11e501eb80c7aca Mon Sep 17 00:00:00 2001 From: wandalen Date: Mon, 7 Apr 2025 07:51:29 +0300 Subject: [PATCH 3/7] llm_tools : evolve --- module/move/llm_tools/src/messaging.rs | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/module/move/llm_tools/src/messaging.rs b/module/move/llm_tools/src/messaging.rs index 39bdbf3349..e1b2505428 100644 --- a/module/move/llm_tools/src/messaging.rs +++ b/module/move/llm_tools/src/messaging.rs @@ -378,21 +378,22 @@ mod private }) } } + } crate::mod_interface! { - own use + own use private:: { - private::LlmError, - private::Value, - private::MessageGenerated, - private::MessageGeneration, - private::Message, - private::Messages, - private::Conversation, - private::MessageSend, - private::MessageStream, - private::ConversationGenerationStream, + LlmError, + Value, + MessageGenerated, + MessageGeneration, + Message, + Messages, + Conversation, + MessageSend, + MessageStream, + ConversationGenerationStream, }; } From 4e1e7701aa1532031c9b7a659a6f126c0b1eb46f Mon Sep 17 00:00:00 2001 From: wandalen Date: Mon, 7 Apr 2025 15:12:50 +0300 Subject: [PATCH 4/7] llm_tools : evolve --- module/move/llm_tools/src/messaging.rs | 399 ------------------ .../llm_tools/src/messaging/conversation.rs | 103 +++++ .../move/llm_tools/src/messaging/message.rs | 44 ++ .../move/llm_tools/src/messaging/messages.rs | 54 +++ module/move/llm_tools/src/messaging/mod.rs | 33 ++ module/move/llm_tools/src/messaging/send.rs | 44 ++ module/move/llm_tools/src/messaging/stream.rs | 100 +++++ 7 files changed, 378 insertions(+), 399 deletions(-) delete mode 100644 module/move/llm_tools/src/messaging.rs create mode 100644 module/move/llm_tools/src/messaging/conversation.rs create mode 100644 module/move/llm_tools/src/messaging/message.rs create mode 100644 module/move/llm_tools/src/messaging/messages.rs create mode 100644 module/move/llm_tools/src/messaging/mod.rs create mode 100644 module/move/llm_tools/src/messaging/send.rs create mode 100644 module/move/llm_tools/src/messaging/stream.rs diff --git a/module/move/llm_tools/src/messaging.rs b/module/move/llm_tools/src/messaging.rs deleted file mode 100644 index e1b2505428..0000000000 --- a/module/move/llm_tools/src/messaging.rs +++ /dev/null @@ -1,399 +0,0 @@ -//! Messaging. - -mod private -{ - use std:: - { - any::Any, - collections::HashMap, - ops::{ Deref, DerefMut }, - pin::Pin, - task::{ Context, Poll }, - }; - - use futures_core:: - { - future::BoxFuture, - stream::Stream, - }; - - /// Represents potential errors that may occur during LLM invocations. - #[ derive( Debug ) ] - pub enum LlmError - { - /// Catch-all variant for unknown or miscellaneous errors. - Unknown( String ), - } - - /// Alias for JSON-based values commonly used for LLM parameters. - pub type Value = serde_json::Value; - - /// A trait defining the behaviors of a generated message from the LLM. - /// - /// Different LLM backends can implement this in various ways to handle - /// partial streaming, token counting, or advanced metadata. - pub trait MessageGenerated: std::fmt::Debug + Send + Sync - { - /// Exposes a method for downcasting implementations if needed. - fn as_any( &self ) -> &dyn Any; - - /// Retrieves the number of tokens used so far, if known. - fn tokens_used( &self ) -> Option; - - /// Retrieves the model identifier, if known. - fn model( &self ) -> Option< &str >; - - /// Asynchronously waits for message generation to complete. - fn wait_for_completion< 'a >( &'a mut self ) -> BoxFuture< 'a, Result< (), LlmError > >; - - /// Provides a stream of partial outputs (tokens, chunks, etc.), if available. - fn partial_stream< 'a >( &'a mut self ) -> Pin< Box< dyn Stream< Item = String > + 'a + Send > >; - } - - /// A default-like implementation of the generation object. - /// - /// This example doesn't truly stream anything, but it showcases how you can - /// store metadata and optionally produce partial content. - #[derive(Debug, Clone)] - pub struct MessageGeneration - { - /// The total number of tokens used for generation, if known. - pub tokens_used_val : Option< u64 >, - /// The model used to generate this message, if known. - pub model_name : Option< String >, - /// Whether the generation is considered final/complete. - pub complete : bool, - /// A queue of partial tokens or chunks for streaming (mocked). - pub partial_content : Vec< String >, - } - - impl MessageGeneration - { - /// Creates a new generator with optional known tokens_used/model. - pub fn new( tokens_used : Option, model : Option< String > ) -> Self - { - Self - { - tokens_used_val : tokens_used, - model_name : model, - complete : true, - partial_content : Vec::new(), - } - } - } - - impl MessageGenerated for MessageGeneration - { - fn as_any( &self ) -> &dyn Any - { - self - } - - fn tokens_used( &self ) -> Option - { - self.tokens_used_val - } - - fn model( &self ) -> Option< &str > - { - self.model_name.as_deref() - } - - fn wait_for_completion< 'a >( &'a mut self ) -> BoxFuture< 'a, Result< (), LlmError > > - { - Box::pin( async move - { - // In a real implementation, you might poll an API or - // wait on a background task. Here, we do nothing. - self.complete = true; - Ok(()) - }) - } - - fn partial_stream< 'a >( &'a mut self ) -> Pin< Box< dyn Stream< Item = String > + 'a + Send > > - { - // Transform the stored partial_content into a simple stream of strings. - let iter = self.partial_content.drain(..); - Box::pin( futures_util::stream::iter( iter ) ) - } - } - - /// Represents a single message in a conversation, either from a user or an assistant. - /// - /// It can optionally contain a dynamically-dispatched object that provides - /// asynchronous access to the message generation process. - #[ derive( Debug ) ] - pub struct Message - { - /// The role of the message sender (e.g., "user", "assistant"). - pub role : String, - /// A unique identifier for the message, if any. - pub id : Option< String >, - /// The main textual content of the message. - pub content : String, - /// Optional handle to the generation process and metadata. - pub response : Option >, - } - - impl Message - { - /// Creates a new user-level or assistant-level message without generation data. - pub fn new( role : &str, content : &str ) -> Self - { - Self - { - role : role.to_string(), - id : None, - content : content.to_string(), - response : None, - } - } - - /// Creates a new message with the provided generation object. - pub fn with_generation - ( - role : &str, - content : &str, - gen : Box< dyn MessageGenerated > - ) -> Self - { - Self - { - role : role.to_string(), - id : None, - content : content.to_string(), - response : Some( gen ), - } - } - } - - /// A thin wrapper around a vector of messages to store a conversation log. - #[ repr( transparent ) ] - #[ derive( Debug ) ] - pub struct Messages( Vec ); - - impl Messages - { - /// Creates a new, empty list of messages. - pub fn new() -> Self - { - Self( Vec::new() ) - } - } - - impl Deref for Messages - { - type Target = Vec; - - fn deref( &self ) -> &Self::Target - { - &self.0 - } - } - - impl DerefMut for Messages - { - fn deref_mut( &mut self ) -> &mut Self::Target - { - &mut self.0 - } - } - - /// Represents a conversation that holds a series of messages and relevant parameters. - #[ derive( Debug ) ] - pub struct Conversation - { - /// A collection of messages exchanged within this conversation. - messages : Messages, - /// A collection of key-value parameters to customize LLM behavior. - parameters : HashMap< String, Value >, - } - - impl Conversation - { - /// Creates a new empty conversation with no parameters. - pub fn new() -> Self - { - Self - { - messages : Messages::new(), - parameters : HashMap::new(), - } - } - - /// Adds or updates a specific parameter for the LLM. - /// - /// # Arguments - /// - /// * `key` - The name of the parameter (e.g., "temperature"). - /// * `val` - The JSON-based value to store for this parameter. - /// - /// # Errors - /// - /// Returns `Err( LlmError::Unknown( ...) )` for unexpected conditions. - pub fn parameter_set - ( - &mut self, - key : &str, - val : Value - ) -> Result< (), LlmError > - { - self.parameters.insert( key.to_string(), val ); - Ok(()) - } - - /// Inserts a context (usually from the conversation's system or user) into the conversation log. - /// - /// # Arguments - /// - /// * `context` - A new message describing the context (e.g., system instructions). - /// - /// # Errors - /// - /// Returns `Err( LlmError::Unknown( ... ) )` for unexpected conditions. - pub fn context - ( - &mut self, - context : Message - ) -> Result< (), LlmError > - { - self.messages.push( context ); - Ok(()) - } - - /// Adds a user or assistant message to the conversation. - /// - /// # Arguments - /// - /// * `message` - The new message to append to the conversation log. - /// - /// # Errors - /// - /// Returns `Err( LlmError::Unknown( ... ) )` for unexpected conditions. - pub fn message_add - ( - &mut self, - message : Message - ) -> Result< (), LlmError > - { - self.messages.push( message ); - Ok(()) - } - } - - /// A trait defining asynchronous single-message retrieval from the LLM. - pub trait MessageSend - { - /// Sends the current conversation state to the LLM and returns a single generated message. - /// - /// # Returns - /// - /// The newly generated message (with optional generation object inside), or an error if something went wrong. - // async fn send( &self ) -> Result< Message, LlmError >; - fn send( &self ) -> impl std::future::Future< Output = Result< Message, LlmError > > + Send; - } - - /// A trait defining asynchronous stream-based retrieval from the LLM. - /// - /// The associated type is a Stream of concrete items (MessageGeneration). - pub trait MessageStream - { - /// The type of the asynchronous stream that yields generated results one by one. - type MessagesStream : Stream< Item = MessageGeneration > + Send + 'static; - - /// Sends the current conversation state to the LLM and returns a stream of generated message chunks. - /// - /// # Returns - /// - /// An asynchronous stream of MessageGeneration objects, or an error if something went wrong. - // async fn stream( &self ) -> Result< Self::MessagesStream, LlmError >; - fn stream( &self ) -> impl std::future::Future< Output = Result< Self::MessagesStream, LlmError > > + Send; - } - - impl MessageSend for Conversation - { - async fn send( &self ) -> Result< Message, LlmError > - { - // Example: returning a new message with a generation object - Ok( Message - { - role : "assistant".to_string(), - id : None, - content : "Mocked LLM Response".to_string(), - response : Some( Box::new( MessageGeneration - { - tokens_used_val : Some( 42 ), - model_name : Some( "MockedModel".to_string() ), - complete : true, - partial_content : vec![], - })), - }) - } - } - - /// The concrete stream type that yields MessageGeneration objects. - #[ derive( Debug ) ] - pub struct ConversationGenerationStream - { - gens : std::vec::IntoIter< MessageGeneration >, - } - - impl Stream for ConversationGenerationStream - { - type Item = MessageGeneration; - - fn poll_next - ( - self : Pin<&mut Self>, - _cx : &mut Context<'_> - ) -> Poll< Option< Self::Item > > - { - let me = self.get_mut(); - Poll::Ready( me.gens.next() ) - } - } - - impl MessageStream for Conversation - { - type MessagesStream = ConversationGenerationStream; - - async fn stream( &self ) -> Result< Self::MessagesStream, LlmError > - { - // Gather all the message-generation objects from the conversation. - let mut all = Vec::new(); - for msg in &self.messages.0 - { - if let Some( ref gen ) = msg.response - { - // Attempt to downcast to our concrete MessageGeneration structure. - if let Some( real_gen ) = gen.as_any().downcast_ref::< MessageGeneration >() - { - all.push( real_gen.clone() ); - } - } - } - Ok( ConversationGenerationStream - { - gens : all.into_iter(), - }) - } - } - -} - -crate::mod_interface! -{ - own use private:: - { - LlmError, - Value, - MessageGenerated, - MessageGeneration, - Message, - Messages, - Conversation, - MessageSend, - MessageStream, - ConversationGenerationStream, - }; -} diff --git a/module/move/llm_tools/src/messaging/conversation.rs b/module/move/llm_tools/src/messaging/conversation.rs new file mode 100644 index 0000000000..590ca30e38 --- /dev/null +++ b/module/move/llm_tools/src/messaging/conversation.rs @@ -0,0 +1,103 @@ +//! Messaging. + +mod private +{ + use crate::*; + use messaging::{ Value, Message, Messages, Error }; + + use std:: + { + collections::HashMap, + }; + + /// Represents a conversation that holds a series of messages and relevant parameters. + #[ derive( Debug ) ] + pub struct Conversation + { + /// A collection of messages exchanged within this conversation. + pub messages : Messages, + /// A collection of key-value parameters to customize LLM behavior. + pub parameters : HashMap< String, Value >, + } + + impl Conversation + { + /// Creates a new empty conversation with no parameters. + pub fn new() -> Self + { + Self + { + messages : Messages::new(), + parameters : HashMap::new(), + } + } + + /// Adds or updates a specific parameter for the LLM. + /// + /// # Arguments + /// + /// * `key` - The name of the parameter (e.g., "temperature"). + /// * `val` - The JSON-based value to store for this parameter. + /// + /// # Errors + /// + /// Returns `Err( Error::Unknown( ...) )` for unexpected conditions. + pub fn parameter_set + ( + &mut self, + key : &str, + val : Value + ) -> Result< (), Error > + { + self.parameters.insert( key.to_string(), val ); + Ok(()) + } + + /// Inserts a context (usually from the conversation's system or user) into the conversation log. + /// + /// # Arguments + /// + /// * `context` - A new message describing the context (e.g., system instructions). + /// + /// # Errors + /// + /// Returns `Err( Error::Unknown( ... ) )` for unexpected conditions. + pub fn context + ( + &mut self, + context : Message + ) -> Result< (), Error > + { + self.messages.push( context ); + Ok(()) + } + + /// Adds a user or assistant message to the conversation. + /// + /// # Arguments + /// + /// * `message` - The new message to append to the conversation log. + /// + /// # Errors + /// + /// Returns `Err( Error::Unknown( ... ) )` for unexpected conditions. + pub fn message_add + ( + &mut self, + message : Message + ) -> Result< (), Error > + { + self.messages.push( message ); + Ok(()) + } + } + +} + +crate::mod_interface! +{ + orphan use private:: + { + Conversation, + }; +} diff --git a/module/move/llm_tools/src/messaging/message.rs b/module/move/llm_tools/src/messaging/message.rs new file mode 100644 index 0000000000..7a94e02c53 --- /dev/null +++ b/module/move/llm_tools/src/messaging/message.rs @@ -0,0 +1,44 @@ +//! Messaging. + +mod private +{ + + /// Represents a single message in a conversation, either from a user or an assistant. + /// + /// It can optionally contain a dynamically-dispatched object that provides + /// asynchronous access to the message generation process. + #[ derive( Debug ) ] + pub struct Message + { + /// The role of the message sender (e.g., "user", "assistant"). + pub role : String, + /// A unique identifier for the message, if any. + pub id : Option< String >, + /// The main textual content of the message. + pub content : String, + } + + impl Message + { + /// Creates a new user-level or assistant-level message without generation data. + pub fn new( role : &str, content : &str ) -> Self + { + Self + { + role : role.to_string(), + id : None, + content : content.to_string(), + } + } + + } + +} + +crate::mod_interface! +{ + orphan use private:: + { + Message, + }; +} diff --git a/module/move/llm_tools/src/messaging/messages.rs b/module/move/llm_tools/src/messaging/messages.rs new file mode 100644 index 0000000000..773b61def1 --- /dev/null +++ b/module/move/llm_tools/src/messaging/messages.rs @@ -0,0 +1,54 @@ +//! Messaging. + +mod private +{ + use crate::*; + use messaging::{ Message }; + + use std:: + { + ops::{ Deref, DerefMut }, + }; + + /// A thin wrapper around a vector of messages to store a conversation log. + #[ repr( transparent ) ] + #[ derive( Debug ) ] + pub struct Messages( pub Vec< Message > ); + + impl Messages + { + /// Creates a new, empty list of messages. + pub fn new() -> Self + { + Self( Vec::new() ) + } + } + + impl Deref for Messages + { + type Target = Vec< Message >; + + fn deref( &self ) -> &Self::Target + { + &self.0 + } + } + + impl DerefMut for Messages + { + fn deref_mut( &mut self ) -> &mut Self::Target + { + &mut self.0 + } + } + + +} + +crate::mod_interface! +{ + orphan use private:: + { + Messages, + }; +} diff --git a/module/move/llm_tools/src/messaging/mod.rs b/module/move/llm_tools/src/messaging/mod.rs new file mode 100644 index 0000000000..afb9a24946 --- /dev/null +++ b/module/move/llm_tools/src/messaging/mod.rs @@ -0,0 +1,33 @@ +//! Messaging. + +mod private +{ + + /// Represents potential errors that may occur during LLM invocations. + #[ derive( Debug ) ] + pub enum Error + { + /// Catch-all variant for unknown or miscellaneous errors. + Unknown( String ), + } + + /// Alias for JSON-based values commonly used for LLM parameters. + pub type Value = serde_json::Value; + +} + +crate::mod_interface! +{ + + layer conversation; + layer message; + layer messages; + layer send; + layer stream; + + own use private:: + { + Error, + Value, + }; +} diff --git a/module/move/llm_tools/src/messaging/send.rs b/module/move/llm_tools/src/messaging/send.rs new file mode 100644 index 0000000000..11d038a390 --- /dev/null +++ b/module/move/llm_tools/src/messaging/send.rs @@ -0,0 +1,44 @@ +//! Messaging. + +mod private +{ + use crate::*; + use messaging::{ Message, Conversation }; + + /// A trait defining asynchronous single-message retrieval from the LLM. + pub trait MessageSend + { + + /// Sends the current conversation state to the LLM and returns a single generated message. + /// + /// # Returns + /// + /// The newly generated message (with optional generation object inside), or an error if something went wrong. + // async fn send( &self ) -> Result< Message, messaging::Error >; + fn send( &self ) -> impl std::future::Future< Output = Result< Message, messaging::Error > > + Send; + + } + + impl MessageSend for Conversation + { + async fn send( &self ) -> Result< Message, messaging::Error > + { + // Example: returning a new message with a generation object + Ok( Message + { + role : "assistant".to_string(), + id : None, + content : "Mocked LLM Response".to_string(), + }) + } + } + +} + +crate::mod_interface! +{ + orphan use private:: + { + MessageSend, + }; +} diff --git a/module/move/llm_tools/src/messaging/stream.rs b/module/move/llm_tools/src/messaging/stream.rs new file mode 100644 index 0000000000..07cab94d18 --- /dev/null +++ b/module/move/llm_tools/src/messaging/stream.rs @@ -0,0 +1,100 @@ +//! Messaging. + +mod private +{ + use crate::*; + use messaging::{ Conversation }; + + use std:: + { + pin::Pin, + task::{ Context, Poll }, + }; + + use futures_core:: + { + // future::BoxFuture, + stream::Stream, + }; + + /// A default-like implementation of the generation object. + /// + /// This example doesn't truly stream anything, but it showcases how you can + /// store metadata and optionally produce partial content. + #[derive(Debug, Clone)] + pub struct MessageGeneration + { + /// The total number of tokens used for generation, if known. + pub tokens_used_val : Option< u64 >, + /// The model used to generate this message, if known. + pub model_name : Option< String >, + /// Whether the generation is considered final/complete. + pub complete : bool, + /// A queue of partial tokens or chunks for streaming (mocked). + pub partial_content : Vec< String >, + } + + /// A trait defining asynchronous stream-based retrieval from the LLM. + /// + /// The associated type is a Stream of concrete items (MessageGeneration). + pub trait MessageStream + { + /// The type of the asynchronous stream that yields generated results one by one. + type MessagesStream : Stream< Item = MessageGeneration > + Send + 'static; + + /// Sends the current conversation state to the LLM and returns a stream of generated message chunks. + /// + /// # Returns + /// + /// An asynchronous stream of MessageGeneration objects, or an error if something went wrong. + // async fn stream( &self ) -> Result< Self::MessagesStream, messaging::Error >; + fn stream( &self ) -> impl std::future::Future< Output = Result< Self::MessagesStream, messaging::Error > > + Send; + } + + /// The concrete stream type that yields MessageGeneration objects. + #[ derive( Debug ) ] + pub struct ConversationGenerationStream + { + gens : std::vec::IntoIter< MessageGeneration >, + } + + impl Stream for ConversationGenerationStream + { + type Item = MessageGeneration; + + fn poll_next + ( + self : Pin<&mut Self>, + _cx : &mut Context<'_> + ) -> Poll< Option< Self::Item > > + { + let me = self.get_mut(); + Poll::Ready( me.gens.next() ) + } + } + + impl MessageStream for Conversation + { + type MessagesStream = ConversationGenerationStream; + + async fn stream( &self ) -> Result< Self::MessagesStream, messaging::Error > + { + let all = Vec::new(); + Ok( ConversationGenerationStream + { + gens : all.into_iter(), + }) + } + } + +} + +crate::mod_interface! +{ + orphan use private:: + { + MessageGeneration, + MessageStream, + ConversationGenerationStream, + }; +} From a39bf991c865cc5d89a8b1c35749bdb639af9140 Mon Sep 17 00:00:00 2001 From: wandalen Date: Tue, 8 Apr 2025 08:06:11 +0300 Subject: [PATCH 5/7] crate asbytes --- Cargo.toml | 3 + module/core/asbytes/Cargo.toml | 44 ++++ module/core/asbytes/License | 22 ++ module/core/asbytes/Readme.md | 83 ++++++ module/core/asbytes/src/lib.rs | 242 ++++++++++++++++++ module/core/asbytes/tests/inc/basic_test.rs | 114 +++++++++ module/core/asbytes/tests/inc/mod.rs | 3 + module/core/asbytes/tests/tests.rs | 9 + .../move/llm_tools/src/messaging/content.rs | 45 ++++ .../llm_tools/src/messaging/conversation.rs | 3 + module/move/llm_tools/src/messaging/mod.rs | 1 + 11 files changed, 569 insertions(+) create mode 100644 module/core/asbytes/Cargo.toml create mode 100644 module/core/asbytes/License create mode 100644 module/core/asbytes/Readme.md create mode 100644 module/core/asbytes/src/lib.rs create mode 100644 module/core/asbytes/tests/inc/basic_test.rs create mode 100644 module/core/asbytes/tests/inc/mod.rs create mode 100644 module/core/asbytes/tests/tests.rs create mode 100644 module/move/llm_tools/src/messaging/content.rs diff --git a/Cargo.toml b/Cargo.toml index a12fceb81a..46bd5a35d0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -613,3 +613,6 @@ version = "1.0.140" [workspace.dependencies.serde_yaml] version = "0.9.34" + +[workspace.dependencies.bytemuck] +version = "1.21.0" diff --git a/module/core/asbytes/Cargo.toml b/module/core/asbytes/Cargo.toml new file mode 100644 index 0000000000..078279a063 --- /dev/null +++ b/module/core/asbytes/Cargo.toml @@ -0,0 +1,44 @@ +[package] +name = "asbytes" +version = "0.1.0" +edition = "2021" +authors = [ + "Kostiantyn Wandalen ", +] +license = "MIT" +readme = "Readme.md" +documentation = "https://docs.rs/asbytes" +repository = "https://github.com/Wandalen/wTools/tree/master/module/core/asbytes" +homepage = "https://github.com/Wandalen/wTools/tree/master/module/core/asbytes" +description = """ +Unified and ergonomic abstraction for converting various data structures into raw byte slices. +""" +categories = [ "algorithms", "development-tools" ] +keywords = [ "fundamental", "general-purpose" ] + +[lints] +workspace = true + +[package.metadata.docs.rs] +features = [ "full" ] +all-features = false + +[features] +default = [ "enabled", "as_bytes", "derive", "must_cast" ] +full = [ "default" ] +enabled = [] +as_bytes = [ "dep:bytemuck" ] + +derive = [ "bytemuck/derive" ] # Provide derive macros for the various traits. +extern_crate_alloc = [ "bytemuck/extern_crate_alloc" ] # Provide utilities for alloc related types such as Box and Vec. +zeroable_maybe_uninit = [ "bytemuck/zeroable_maybe_uninit" ] # and zeroable_atomics: Provide more Zeroable impls. +wasm_simd = [ "bytemuck/wasm_simd" ] # Support more SIMD types. +aarch64_simd = [ "bytemuck/aarch64_simd" ] # Support more SIMD types. +min_const_generics = [ "bytemuck/min_const_generics" ] # Provides appropriate impls for arrays of all lengths instead of just for a select list of array lengths. +must_cast = [ "bytemuck/must_cast" ] # Provides the must_ functions, which will compile error if the requested cast can’t be statically verified. +const_zeroed = [ "bytemuck/const_zeroed" ] # + +[dependencies] +bytemuck = { workspace = true, optional = true } + +[dev-dependencies] diff --git a/module/core/asbytes/License b/module/core/asbytes/License new file mode 100644 index 0000000000..0804aed8e3 --- /dev/null +++ b/module/core/asbytes/License @@ -0,0 +1,22 @@ +Copyright Kostiantyn Mysnyk and Out of the Box Systems (c) 2021-2024 + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. diff --git a/module/core/asbytes/Readme.md b/module/core/asbytes/Readme.md new file mode 100644 index 0000000000..c6667399eb --- /dev/null +++ b/module/core/asbytes/Readme.md @@ -0,0 +1,83 @@ + + +# Module :: asbytes +[![experimental](https://raster.shields.io/static/v1?label=stability&message=experimental&color=orange&logoColor=eee)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/ModuleasbytesPush.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/ModuleasbytesPush.yml) [![docs.rs](https://img.shields.io/docsrs/asbytes?color=e3e8f0&logo=docs.rs)](https://docs.rs/asbytes) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + +The `asbytes` crate provides a convenient trait, `AsBytes`, for viewing common data structures as raw byte slices (`&[u8]`). It focuses on types that are safe to represent as bytes (Plain Old Data, or POD), leveraging the safety guarantees of the underlying `bytemuck` crate. + +## Why `asbytes`? + +While `bytemuck` provides the core functionality for safe byte-level casting (like `bytemuck::cast_slice` for collections and `bytemuck::bytes_of` for single items), `asbytes` offers a unified trait-based approach for common use cases: + +1. **Consistency:** The `AsBytes` trait provides a single method, `.as_bytes()`, that works consistently across supported types like `Vec`, slices (`&[T]`), arrays (`[T; N]`), and single POD items wrapped in a tuple `(T,)`. +2. **Readability:** Calling `.as_bytes()` clearly signals the intent to get the raw byte representation, which is useful for tasks like serialization, hashing, or interfacing with low-level APIs (graphics, networking, etc.). +3. **Simpler Generics:** Functions can accept `T: AsBytes` to work generically with the byte representation of different compatible data structures. +4. **Convenience:** The trait also provides `.byte_size()` and `.len()` methods for easily getting the size in bytes and the number of elements, respectively. + +Essentially, `asbytes` acts as a focused convenience layer on top of `bytemuck` for the specific task of viewing data as bytes via a consistent trait method. + +## How asbytes Differs from bytemuck + +While bytemuck offers safe transmutation via its `Pod` trait and functions like `cast_slice`, it does not expose a dedicated trait for converting data structures into byte slices. `asbytes` introduces the `AsBytes` trait, abstracting these conversions and providing additional conveniences—such as direct byte size computation—on top of bytemuck's proven foundation. + +### Example + +```rust +// Make sure bytemuck is available for derives +extern crate bytemuck; +use asbytes::AsBytes; // Import the trait + +// Define a POD struct +#[ repr( C ) ] +#[ derive( Clone, Copy, bytemuck::Pod, bytemuck::Zeroable ) ] +struct Point +{ + x : f32, + y : f32, +} + +fn main() +{ + // --- Collections --- + let points_vec : Vec< Point > = vec![ Point { x : 1.0, y : 2.0 }, Point { x : 3.0, y : 4.0 } ]; + let points_slice : &[ Point ] = &points_vec[ .. ]; + let points_array : [ Point; 1 ] = [ Point { x : 5.0, y : 6.0 } ]; + + let vec_bytes = points_vec.as_bytes(); + let slice_bytes = points_slice.as_bytes(); + let array_bytes = points_array.as_bytes(); + + println!( "Vec Bytes: length={}, data={:?}", points_vec.byte_size(), vec_bytes ); + println!( "Slice Bytes: length={}, data={:?}", slice_bytes.byte_size(), slice_bytes ); + println!( "Array Bytes: length={}, data={:?}", points_array.byte_size(), array_bytes ); + println!( "Vec Element Count: {}", points_vec.len() ); // Output: 2 + println!( "Array Element Count: {}", points_array.len() ); // Output: 1 + + // --- Single POD Item (using tuple trick) --- + let single_point = Point { x : -1.0, y : -2.0 }; + let single_point_tuple = ( single_point, ); // Wrap in a single-element tuple + + let point_bytes = single_point_tuple.as_bytes(); + println!( "Single Point Bytes: length={}, data={:?}", single_point_tuple.byte_size(), point_bytes ); + println!( "Single Point Element Count: {}", single_point_tuple.len() ); // Output: 1 + + let scalar_tuple = ( 12345u32, ); + let scalar_bytes = scalar_tuple.as_bytes(); + println!( "Scalar Bytes: length={}, data={:?}", scalar_tuple.byte_size(), scalar_bytes ); +} +``` + +### To add to your project + +```sh +cargo add asbytes +``` + +### Try out from the repository + +```sh +git clone https://github.com/Wandalen/wTools +cd wTools +cd examples/asbytes +cargo run +``` diff --git a/module/core/asbytes/src/lib.rs b/module/core/asbytes/src/lib.rs new file mode 100644 index 0000000000..a5439f8068 --- /dev/null +++ b/module/core/asbytes/src/lib.rs @@ -0,0 +1,242 @@ + +#![ doc( html_logo_url = "https://raw.githubusercontent.com/Wandalen/wTools/master/asset/img/logo_v3_trans_square.png" ) ] +#![ doc( html_favicon_url = "https://raw.githubusercontent.com/Wandalen/wTools/alpha/asset/img/logo_v3_trans_square_icon_small_v2.ico" ) ] +#![ doc( html_root_url = "https://docs.rs/asbytes/latest/asbytes/" ) ] +#![ doc = include_str!( concat!( env!( "CARGO_MANIFEST_DIR" ), "/", "Readme.md" ) ) ] + +/// Namespace with dependencies. +#[ cfg( feature = "enabled" ) ] +pub mod dependency +{ + pub use ::bytemuck; +} + +/// Define a private namespace for all its items. +#[ cfg( feature = "enabled" ) ] +mod private +{ + + pub use bytemuck:: + { + Pod, + }; + + /// Trait for converting data to byte slices. + /// This trait abstracts the conversion of types that implement Pod into their raw byte representation. + #[ cfg( feature = "as_bytes" ) ] + pub trait AsBytes + { + + /// Returns the underlying byte slice of the data. + fn as_bytes( &self ) -> &[ u8 ] + ; + + /// Returns the size in bytes of the data. + #[ inline ] + fn byte_size( &self ) -> usize + { + self.as_bytes().len() + } + + /// Returns the count of scalar elements contained in the data. + /// For flat structures, this corresponds to the number of elements. + /// For multidimensional data, this value may differ from the total number of components. + fn len( &self ) -> usize; + + } + + /// Implementation for any single POD type. + impl< T : Pod > AsBytes for ( T, ) + { + + #[ inline ] + fn as_bytes( &self ) -> &[ u8 ] + { + // Use bytes_of to get the byte slice of a single POD item + bytemuck::bytes_of( &self.0 ) + } + + #[ inline ] + fn byte_size( &self ) -> usize + { + // The size is simply the size of the type itself + std::mem::size_of::< T >() + } + + #[ inline ] + fn len( &self ) -> usize + { + // A single item has a length of 1 element + 1 + } + + } + + impl< T : Pod > AsBytes for Vec< T > + { + + #[ inline ] + fn as_bytes( &self ) -> &[ u8 ] + { + bytemuck::cast_slice( self ) + } + + #[ inline ] + fn byte_size( &self ) -> usize + { + self.len() * std::mem::size_of::< T >() / std::mem::size_of::< u8 >() + } + + #[ inline ] + fn len( &self ) -> usize + { + self.len() + } + + } + + impl< T : Pod > AsBytes for [ T ] + { + + #[ inline ] + fn as_bytes( &self ) -> &[ u8 ] + { + bytemuck::cast_slice( self ) + } + + #[ inline ] + fn byte_size( &self ) -> usize + { + self.len() * std::mem::size_of::< T >() / std::mem::size_of::< u8 >() + } + + #[ inline ] + fn len( &self ) -> usize + { + self.len() + } + + } + + impl< T : Pod, const N : usize > AsBytes for [ T ; N ] + { + + #[ inline ] + fn as_bytes( &self ) -> &[ u8 ] + { + bytemuck::cast_slice( self ) + } + + #[ inline ] + fn byte_size( &self ) -> usize + { + self.len() * std::mem::size_of::< T >() / std::mem::size_of::< u8 >() + } + + #[ inline ] + fn len( &self ) -> usize + { + N + } + + } + +} + +#[ cfg( feature = "enabled" ) ] +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use own::*; + +/// Own namespace of the module. +#[ cfg( feature = "enabled" ) ] +#[ allow( unused_imports ) ] +pub mod own +{ + use super::*; + + #[ doc( inline ) ] + pub use orphan::*; + + #[ doc( inline ) ] + pub use bytemuck:: + { + checked, + offset_of, + bytes_of, + bytes_of_mut, + cast, + cast_mut, + cast_ref, + cast_slice, + cast_slice_mut, + fill_zeroes, + from_bytes, + from_bytes_mut, + pod_align_to, + pod_align_to_mut, + pod_read_unaligned, + try_cast, + try_cast_mut, + try_cast_ref, + try_cast_slice, + try_cast_slice_mut, + try_from_bytes, + try_from_bytes_mut, + try_pod_read_unaligned, + write_zeroes, + CheckedBitPattern, + PodCastError, + AnyBitPattern, + Contiguous, + NoUninit, + Pod, + PodInOption, + TransparentWrapper, + Zeroable, + ZeroableInOption, + }; +} + +#[ cfg( feature = "enabled" ) ] +#[ doc( inline ) ] +#[ allow( unused_imports ) ] +pub use own::*; + +/// Orphan namespace of the module. +#[ cfg( feature = "enabled" ) ] +#[ allow( unused_imports ) ] +pub mod orphan +{ + use super::*; + #[ doc( inline ) ] + pub use exposed::*; + +} + +/// Exposed namespace of the module. +#[ cfg( feature = "enabled" ) ] +#[ allow( unused_imports ) ] +pub mod exposed +{ + use super::*; + + #[ doc( inline ) ] + pub use prelude::*; + + #[ cfg( feature = "as_bytes" ) ] + pub use private:: + { + AsBytes, + Pod, + }; + +} + +/// Prelude to use essentials: `use my_module::prelude::*`. +#[ cfg( feature = "enabled" ) ] +#[ allow( unused_imports ) ] +pub mod prelude +{ + use super::*; +} diff --git a/module/core/asbytes/tests/inc/basic_test.rs b/module/core/asbytes/tests/inc/basic_test.rs new file mode 100644 index 0000000000..fcd29535c9 --- /dev/null +++ b/module/core/asbytes/tests/inc/basic_test.rs @@ -0,0 +1,114 @@ +#![ cfg( all( feature = "enabled", feature = "as_bytes" ) ) ] + +// Define a simple POD struct for testing +#[ repr( C ) ] +#[ derive( Clone, Copy, Debug, PartialEq, bytemuck::Pod, bytemuck::Zeroable ) ] +struct Point +{ + x : i32, + y : i32, +} + +#[ test ] +fn test_tuple_scalar_as_bytes() +{ + { + use asbytes::AsBytes; + use std::mem; + + let scalar_tuple = ( 123u32, ); + let bytes = scalar_tuple.as_bytes(); + let expected_length = mem::size_of::< u32 >(); + + assert_eq!( bytes.len(), expected_length ); + assert_eq!( scalar_tuple.byte_size(), expected_length ); + assert_eq!( scalar_tuple.len(), 1 ); // Length of tuple is 1 element + + // Verify content (assuming little-endian) + assert_eq!( bytes, &123u32.to_le_bytes() ); + } +} + +#[ test ] +fn test_tuple_struct_as_bytes() +{ + { + use asbytes::AsBytes; + use std::mem; + + let point = Point { x : 10, y : -20 }; + let struct_tuple = ( point, ); + let bytes = struct_tuple.as_bytes(); + let expected_length = mem::size_of::< Point >(); + + assert_eq!( bytes.len(), expected_length ); + assert_eq!( struct_tuple.byte_size(), expected_length ); + assert_eq!( struct_tuple.len(), 1 ); // Length of tuple is 1 element + + // Verify content using bytemuck::bytes_of for comparison + assert_eq!( bytes, bytemuck::bytes_of( &point ) ); + } +} + +#[ test ] +fn test_vec_as_bytes() +{ + { + use asbytes::AsBytes; + use std::mem; + let v = vec![ 1u32, 2, 3, 4 ]; + let bytes = v.as_bytes(); + let expected_length = v.len() * mem::size_of::< u32 >(); + assert_eq!( bytes.len(), expected_length ); + assert_eq!( v.byte_size(), expected_length ); + assert_eq!( v.len(), 4 ); // Length of Vec is number of elements + } +} + +#[ test ] +fn test_slice_as_bytes() +{ + { + use asbytes::exposed::AsBytes; // Using exposed path + use std::mem; + let slice : &[ u32 ] = & [ 10, 20, 30 ]; + let bytes = slice.as_bytes(); + let expected_length = slice.len() * mem::size_of::< u32 >(); + assert_eq!( bytes.len(), expected_length ); + assert_eq!( slice.byte_size(), expected_length ); + assert_eq!( slice.len(), 3 ); // Length of slice is number of elements + } +} + +#[ test ] +fn test_array_as_bytes() +{ + { + use asbytes::own::AsBytes; // Using own path + use std::mem; + let arr : [ u32 ; 3 ] = [ 100, 200, 300 ]; + let bytes = arr.as_bytes(); + let expected_length = arr.len() * mem::size_of::< u32 >(); + assert_eq!( bytes.len(), expected_length ); + assert_eq!( arr.byte_size(), expected_length ); + assert_eq!( arr.len(), 3 ); // Length of array is compile-time size N + } +} + +#[ test ] +fn test_vec_struct_as_bytes() +{ + { + use asbytes::AsBytes; + use std::mem; + let points = vec![ Point { x : 1, y : 2 }, Point { x : 3, y : 4 } ]; + let bytes = points.as_bytes(); + let expected_length = points.len() * mem::size_of::< Point >(); + assert_eq!( bytes.len(), expected_length ); + assert_eq!( points.byte_size(), expected_length ); + assert_eq!( points.len(), 2 ); + + // Verify content using bytemuck::cast_slice for comparison + assert_eq!( bytes, bytemuck::cast_slice( &points[ .. ] ) ); + } +} \ No newline at end of file diff --git a/module/core/asbytes/tests/inc/mod.rs b/module/core/asbytes/tests/inc/mod.rs new file mode 100644 index 0000000000..329271ad56 --- /dev/null +++ b/module/core/asbytes/tests/inc/mod.rs @@ -0,0 +1,3 @@ +use super::*; + +mod basic_test; diff --git a/module/core/asbytes/tests/tests.rs b/module/core/asbytes/tests/tests.rs new file mode 100644 index 0000000000..86cb09e4aa --- /dev/null +++ b/module/core/asbytes/tests/tests.rs @@ -0,0 +1,9 @@ +//! All tests. +#![ allow( unused_imports ) ] + +include!( "../../../../module/step/meta/src/module/terminal.rs" ); + +use asbytes as the_module; + +#[ cfg( feature = "enabled" ) ] +mod inc; diff --git a/module/move/llm_tools/src/messaging/content.rs b/module/move/llm_tools/src/messaging/content.rs new file mode 100644 index 0000000000..6eb4507b91 --- /dev/null +++ b/module/move/llm_tools/src/messaging/content.rs @@ -0,0 +1,45 @@ +// //! Content of a message which can be not only text, but also other media type. +// +// mod private +// { +// +// pub enum ContentType +// { +// Text, +// Image, +// Sound, +// Video, +// } +// +// pub trait Content +// { +// fn content_type( &self ) -> ContentType; +// fn content_to_string( self ) -> String; +// fn content_to_bytes( self ) -> Vec< u8 >; +// } +// +// /// Image +// #[ derive( Debug ) ] +// pub struct Image +// { +// pub source : Source, +// } +// +// /// Source +// #[ derive( Debug ) ] +// pub struct Source +// { +// pub media_type : String, +// pub encoding : String, +// pub data : AsBytes, +// } +// +// } +// +// crate::mod_interface! +// { +// orphan use private:: +// { +// Content, +// }; +// } diff --git a/module/move/llm_tools/src/messaging/conversation.rs b/module/move/llm_tools/src/messaging/conversation.rs index 590ca30e38..89c7486670 100644 --- a/module/move/llm_tools/src/messaging/conversation.rs +++ b/module/move/llm_tools/src/messaging/conversation.rs @@ -14,6 +14,8 @@ mod private #[ derive( Debug ) ] pub struct Conversation { + /// Systems instuction for context. + pub context : String, /// A collection of messages exchanged within this conversation. pub messages : Messages, /// A collection of key-value parameters to customize LLM behavior. @@ -27,6 +29,7 @@ mod private { Self { + context : Default::default(), messages : Messages::new(), parameters : HashMap::new(), } diff --git a/module/move/llm_tools/src/messaging/mod.rs b/module/move/llm_tools/src/messaging/mod.rs index afb9a24946..94d160f787 100644 --- a/module/move/llm_tools/src/messaging/mod.rs +++ b/module/move/llm_tools/src/messaging/mod.rs @@ -19,6 +19,7 @@ mod private crate::mod_interface! { + // layer content; layer conversation; layer message; layer messages; From f2a36e74d0d37b001bfa9df2d517b23aa2dea860 Mon Sep 17 00:00:00 2001 From: wandalen Date: Tue, 8 Apr 2025 08:08:27 +0300 Subject: [PATCH 6/7] publish --- .github/workflows/module_asbytes_push.yml | 24 +++++++++++++++++++ .../module_graphs_tools_deprecated_push.yml | 24 +++++++++++++++++++ .github/workflows/module_gspread_push.yml | 24 +++++++++++++++++++ .github/workflows/module_llm_tools_push.yml | 24 +++++++++++++++++++ Readme.md | 16 ++++++++----- module/alias/proc_macro_tools/Readme.md | 2 +- module/alias/werror/Readme.md | 2 +- module/alias/winterval/Readme.md | 2 +- module/alias/wstring_tools/Readme.md | 2 +- module/alias/wtest/Readme.md | 2 +- module/core/clone_dyn/Readme.md | 2 +- module/core/clone_dyn_types/Readme.md | 2 +- module/core/collection_tools/Readme.md | 2 +- module/core/data_type/Readme.md | 2 +- module/core/derive_tools/Readme.md | 2 +- module/core/diagnostics_tools/Readme.md | 2 +- module/core/error_tools/Readme.md | 2 +- module/core/for_each/Readme.md | 2 +- module/core/format_tools/Readme.md | 2 +- module/core/former/Readme.md | 2 +- module/core/former_types/Readme.md | 2 +- module/core/implements/Readme.md | 2 +- module/core/impls_index/Readme.md | 2 +- module/core/inspect_type/Readme.md | 2 +- module/core/interval_adapter/Readme.md | 2 +- module/core/is_slice/Readme.md | 2 +- module/core/iter_tools/Readme.md | 2 +- module/core/macro_tools/Readme.md | 2 +- module/core/mem_tools/Readme.md | 2 +- module/core/meta_tools/Readme.md | 2 +- module/core/reflect_tools/Readme.md | 2 +- module/core/strs_tools/Readme.md | 2 +- module/core/test_tools/Readme.md | 2 +- module/core/time_tools/Readme.md | 2 +- module/core/typing_tools/Readme.md | 2 +- module/core/variadic_from/Readme.md | 2 +- module/core/wtools/Readme.md | 2 +- module/move/crates_tools/Readme.md | 2 +- module/move/deterministic_rand/Readme.md | 2 +- module/move/graphs_tools/Readme.md | 2 +- module/move/graphs_tools_deprecated/Readme.md | 2 +- module/move/wca/Readme.md | 2 +- 42 files changed, 143 insertions(+), 43 deletions(-) create mode 100644 .github/workflows/module_asbytes_push.yml create mode 100644 .github/workflows/module_graphs_tools_deprecated_push.yml create mode 100644 .github/workflows/module_gspread_push.yml create mode 100644 .github/workflows/module_llm_tools_push.yml diff --git a/.github/workflows/module_asbytes_push.yml b/.github/workflows/module_asbytes_push.yml new file mode 100644 index 0000000000..1bdb9cd947 --- /dev/null +++ b/.github/workflows/module_asbytes_push.yml @@ -0,0 +1,24 @@ +name : asbytes + +on : + push : + branches : + - 'alpha' + - 'beta' + - 'master' + + +env : + CARGO_TERM_COLOR : always + +jobs : + + # asbytes + + test : + uses : Wandalen/wTools/.github/workflows/standard_rust_push.yml@alpha + with : + manifest_path : 'module/core/asbytes/Cargo.toml' + module_name : 'asbytes' + commit_message : ${{ github.event.head_commit.message }} + commiter_username: ${{ github.event.head_commit.committer.username }} diff --git a/.github/workflows/module_graphs_tools_deprecated_push.yml b/.github/workflows/module_graphs_tools_deprecated_push.yml new file mode 100644 index 0000000000..2ebcbf9176 --- /dev/null +++ b/.github/workflows/module_graphs_tools_deprecated_push.yml @@ -0,0 +1,24 @@ +name : graphs_tools_deprecated + +on : + push : + branches : + - 'alpha' + - 'beta' + - 'master' + + +env : + CARGO_TERM_COLOR : always + +jobs : + + # graphs_tools_deprecated + + test : + uses : Wandalen/wTools/.github/workflows/standard_rust_push.yml@alpha + with : + manifest_path : 'module/move/graphs_tools_deprecated/Cargo.toml' + module_name : 'graphs_tools_deprecated' + commit_message : ${{ github.event.head_commit.message }} + commiter_username: ${{ github.event.head_commit.committer.username }} diff --git a/.github/workflows/module_gspread_push.yml b/.github/workflows/module_gspread_push.yml new file mode 100644 index 0000000000..b13aad55e7 --- /dev/null +++ b/.github/workflows/module_gspread_push.yml @@ -0,0 +1,24 @@ +name : gspread + +on : + push : + branches : + - 'alpha' + - 'beta' + - 'master' + + +env : + CARGO_TERM_COLOR : always + +jobs : + + # gspread + + test : + uses : Wandalen/wTools/.github/workflows/standard_rust_push.yml@alpha + with : + manifest_path : 'module/move/gspread/Cargo.toml' + module_name : 'gspread' + commit_message : ${{ github.event.head_commit.message }} + commiter_username: ${{ github.event.head_commit.committer.username }} diff --git a/.github/workflows/module_llm_tools_push.yml b/.github/workflows/module_llm_tools_push.yml new file mode 100644 index 0000000000..733d5c0094 --- /dev/null +++ b/.github/workflows/module_llm_tools_push.yml @@ -0,0 +1,24 @@ +name : llm_tools + +on : + push : + branches : + - 'alpha' + - 'beta' + - 'master' + + +env : + CARGO_TERM_COLOR : always + +jobs : + + # llm_tools + + test : + uses : Wandalen/wTools/.github/workflows/standard_rust_push.yml@alpha + with : + manifest_path : 'module/move/llm_tools/Cargo.toml' + module_name : 'llm_tools' + commit_message : ${{ github.event.head_commit.message }} + commiter_username: ${{ github.event.head_commit.committer.username }} diff --git a/Readme.md b/Readme.md index 1dd88d3db6..7aa8c81f16 100644 --- a/Readme.md +++ b/Readme.md @@ -27,33 +27,34 @@ Collection of general purpose tools for solving problems. Fundamentally extend t | [clone_dyn](module/core/clone_dyn) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_clone_dyn_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_clone_dyn_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_clone_dyn_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_clone_dyn_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/clone_dyn) | [![Open in Gitpod](https://raster.shields.io/static/v1?label=&message=try&color=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Fclone_dyn%2Fexamples%2Fclone_dyn_trivial.rs,RUN_POSTFIX=--example%20clone_dyn_trivial/https://github.com/Wandalen/wTools) | | [variadic_from](module/core/variadic_from) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_variadic_from_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_variadic_from_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_variadic_from_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_variadic_from_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/variadic_from) | [![Open in Gitpod](https://raster.shields.io/static/v1?label=&message=try&color=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Fvariadic_from%2Fexamples%2Fvariadic_from_trivial.rs,RUN_POSTFIX=--example%20variadic_from_trivial/https://github.com/Wandalen/wTools) | | [derive_tools](module/core/derive_tools) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_derive_tools_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_derive_tools_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_derive_tools_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_derive_tools_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/derive_tools) | [![Open in Gitpod](https://raster.shields.io/static/v1?label=&message=try&color=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Fderive_tools%2Fexamples%2Fderive_tools_trivial.rs,RUN_POSTFIX=--example%20derive_tools_trivial/https://github.com/Wandalen/wTools) | -| [mod_interface_meta](module/core/mod_interface_meta) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_mod_interface_meta_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_mod_interface_meta_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_mod_interface_meta_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_mod_interface_meta_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/mod_interface_meta) | | | [former_meta](module/core/former_meta) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_former_meta_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_former_meta_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_former_meta_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_former_meta_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/former_meta) | | | [impls_index_meta](module/core/impls_index_meta) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_impls_index_meta_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_impls_index_meta_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_impls_index_meta_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_impls_index_meta_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/impls_index_meta) | | -| [mod_interface](module/core/mod_interface) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_mod_interface_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_mod_interface_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_mod_interface_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_mod_interface_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/mod_interface) | | -| [error_tools](module/core/error_tools) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_error_tools_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_error_tools_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_error_tools_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_error_tools_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/error_tools) | [![Open in Gitpod](https://raster.shields.io/static/v1?label=&message=try&color=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Ferror_tools%2Fexamples%2Ferror_tools_trivial.rs,RUN_POSTFIX=--example%20error_tools_trivial/https://github.com/Wandalen/wTools) | +| [mod_interface_meta](module/core/mod_interface_meta) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_mod_interface_meta_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_mod_interface_meta_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_mod_interface_meta_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_mod_interface_meta_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/mod_interface_meta) | | | [for_each](module/core/for_each) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_for_each_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_for_each_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_for_each_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_for_each_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/for_each) | [![Open in Gitpod](https://raster.shields.io/static/v1?label=&message=try&color=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Ffor_each%2Fexamples%2Ffor_each_trivial.rs,RUN_POSTFIX=--example%20for_each_trivial/https://github.com/Wandalen/wTools) | | [former](module/core/former) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_former_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_former_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_former_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_former_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/former) | [![Open in Gitpod](https://raster.shields.io/static/v1?label=&message=try&color=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Fformer%2Fexamples%2Fformer_trivial.rs,RUN_POSTFIX=--example%20former_trivial/https://github.com/Wandalen/wTools) | | [implements](module/core/implements) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_implements_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_implements_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_implements_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_implements_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/implements) | [![Open in Gitpod](https://raster.shields.io/static/v1?label=&message=try&color=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Fimplements%2Fexamples%2Fimplements_trivial.rs,RUN_POSTFIX=--example%20implements_trivial/https://github.com/Wandalen/wTools) | | [impls_index](module/core/impls_index) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_impls_index_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_impls_index_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_impls_index_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_impls_index_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/impls_index) | [![Open in Gitpod](https://raster.shields.io/static/v1?label=&message=try&color=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Fimpls_index%2Fexamples%2Fimpls_index_trivial.rs,RUN_POSTFIX=--example%20impls_index_trivial/https://github.com/Wandalen/wTools) | | [inspect_type](module/core/inspect_type) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_inspect_type_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_inspect_type_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_inspect_type_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_inspect_type_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/inspect_type) | [![Open in Gitpod](https://raster.shields.io/static/v1?label=&message=try&color=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Finspect_type%2Fexamples%2Finspect_type_trivial.rs,RUN_POSTFIX=--example%20inspect_type_trivial/https://github.com/Wandalen/wTools) | | [is_slice](module/core/is_slice) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_is_slice_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_is_slice_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_is_slice_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_is_slice_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/is_slice) | [![Open in Gitpod](https://raster.shields.io/static/v1?label=&message=try&color=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Fis_slice%2Fexamples%2Fis_slice_trivial.rs,RUN_POSTFIX=--example%20is_slice_trivial/https://github.com/Wandalen/wTools) | -| [pth](module/core/pth) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_pth_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_pth_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_pth_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_pth_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/pth) | | +| [mod_interface](module/core/mod_interface) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_mod_interface_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_mod_interface_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_mod_interface_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_mod_interface_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/mod_interface) | | | [reflect_tools_meta](module/core/reflect_tools_meta) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_reflect_tools_meta_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_reflect_tools_meta_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_reflect_tools_meta_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_reflect_tools_meta_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/reflect_tools_meta) | | +| [async_from](module/core/async_from) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_async_from_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_async_from_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_async_from_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_async_from_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/async_from) | | | [data_type](module/core/data_type) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_data_type_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_data_type_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_data_type_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_data_type_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/data_type) | [![Open in Gitpod](https://raster.shields.io/static/v1?label=&message=try&color=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Fdata_type%2Fexamples%2Fdata_type_trivial.rs,RUN_POSTFIX=--example%20data_type_trivial/https://github.com/Wandalen/wTools) | | [diagnostics_tools](module/core/diagnostics_tools) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_diagnostics_tools_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_diagnostics_tools_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_diagnostics_tools_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_diagnostics_tools_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/diagnostics_tools) | [![Open in Gitpod](https://raster.shields.io/static/v1?label=&message=try&color=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Fdiagnostics_tools%2Fexamples%2Fdiagnostics_tools_trivial.rs,RUN_POSTFIX=--example%20diagnostics_tools_trivial/https://github.com/Wandalen/wTools) | +| [error_tools](module/core/error_tools) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_error_tools_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_error_tools_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_error_tools_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_error_tools_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/error_tools) | [![Open in Gitpod](https://raster.shields.io/static/v1?label=&message=try&color=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Ferror_tools%2Fexamples%2Ferror_tools_trivial.rs,RUN_POSTFIX=--example%20error_tools_trivial/https://github.com/Wandalen/wTools) | | [mem_tools](module/core/mem_tools) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_mem_tools_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_mem_tools_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_mem_tools_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_mem_tools_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/mem_tools) | [![Open in Gitpod](https://raster.shields.io/static/v1?label=&message=try&color=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Fmem_tools%2Fexamples%2Fmem_tools_trivial.rs,RUN_POSTFIX=--example%20mem_tools_trivial/https://github.com/Wandalen/wTools) | | [meta_tools](module/core/meta_tools) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_meta_tools_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_meta_tools_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_meta_tools_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_meta_tools_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/meta_tools) | [![Open in Gitpod](https://raster.shields.io/static/v1?label=&message=try&color=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Fmeta_tools%2Fexamples%2Fmeta_tools_trivial.rs,RUN_POSTFIX=--example%20meta_tools_trivial/https://github.com/Wandalen/wTools) | -| [process_tools](module/core/process_tools) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_process_tools_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_process_tools_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_process_tools_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_process_tools_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/process_tools) | | +| [pth](module/core/pth) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_pth_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_pth_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_pth_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_pth_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/pth) | | | [reflect_tools](module/core/reflect_tools) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_reflect_tools_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_reflect_tools_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_reflect_tools_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_reflect_tools_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/reflect_tools) | [![Open in Gitpod](https://raster.shields.io/static/v1?label=&message=try&color=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Freflect_tools%2Fexamples%2Freflect_tools_trivial.rs,RUN_POSTFIX=--example%20reflect_tools_trivial/https://github.com/Wandalen/wTools) | | [strs_tools](module/core/strs_tools) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_strs_tools_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_strs_tools_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_strs_tools_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_strs_tools_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/strs_tools) | [![Open in Gitpod](https://raster.shields.io/static/v1?label=&message=try&color=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Fstrs_tools%2Fexamples%2Fstrs_tools_trivial.rs,RUN_POSTFIX=--example%20strs_tools_trivial/https://github.com/Wandalen/wTools) | | [time_tools](module/core/time_tools) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_time_tools_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_time_tools_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_time_tools_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_time_tools_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/time_tools) | [![Open in Gitpod](https://raster.shields.io/static/v1?label=&message=try&color=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Ftime_tools%2Fexamples%2Ftime_tools_trivial.rs,RUN_POSTFIX=--example%20time_tools_trivial/https://github.com/Wandalen/wTools) | | [typing_tools](module/core/typing_tools) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_typing_tools_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_typing_tools_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_typing_tools_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_typing_tools_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/typing_tools) | [![Open in Gitpod](https://raster.shields.io/static/v1?label=&message=try&color=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Ftyping_tools%2Fexamples%2Ftyping_tools_trivial.rs,RUN_POSTFIX=--example%20typing_tools_trivial/https://github.com/Wandalen/wTools) | -| [async_from](module/core/async_from) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_async_from_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_async_from_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_async_from_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_async_from_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/async_from) | | +| [asbytes](module/core/asbytes) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_asbytes_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_asbytes_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_asbytes_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_asbytes_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/asbytes) | | | [async_tools](module/core/async_tools) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_async_tools_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_async_tools_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_async_tools_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_async_tools_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/async_tools) | | | [format_tools](module/core/format_tools) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_format_tools_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_format_tools_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_format_tools_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_format_tools_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/format_tools) | [![Open in Gitpod](https://raster.shields.io/static/v1?label=&message=try&color=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Fformat_tools%2Fexamples%2Fformat_tools_trivial.rs,RUN_POSTFIX=--example%20format_tools_trivial/https://github.com/Wandalen/wTools) | | [fs_tools](module/core/fs_tools) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_fs_tools_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_fs_tools_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_fs_tools_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_fs_tools_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/fs_tools) | | | [include_md](module/core/include_md) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_include_md_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_include_md_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_include_md_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_include_md_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/include_md) | | +| [process_tools](module/core/process_tools) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_process_tools_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_process_tools_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_process_tools_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_process_tools_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/process_tools) | | | [program_tools](module/core/program_tools) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_program_tools_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_program_tools_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_program_tools_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_program_tools_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/program_tools) | | | [test_tools](module/core/test_tools) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_test_tools_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_test_tools_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_test_tools_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_test_tools_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/test_tools) | [![Open in Gitpod](https://raster.shields.io/static/v1?label=&message=try&color=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Ftest_tools%2Fexamples%2Ftest_tools_trivial.rs,RUN_POSTFIX=--example%20test_tools_trivial/https://github.com/Wandalen/wTools) | | [wtools](module/core/wtools) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_wtools_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_wtools_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_wtools_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_wtools_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/wtools) | [![Open in Gitpod](https://raster.shields.io/static/v1?label=&message=try&color=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Fwtools%2Fexamples%2Fwtools_trivial.rs,RUN_POSTFIX=--example%20wtools_trivial/https://github.com/Wandalen/wTools) | @@ -70,6 +71,9 @@ Collection of general purpose tools for solving problems. Fundamentally extend t | [wplot](module/move/wplot) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_wplot_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_wplot_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_wplot_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_wplot_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/wplot) | | | [assistant](module/move/assistant) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_assistant_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_assistant_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_assistant_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_assistant_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/assistant) | | | [graphs_tools](module/move/graphs_tools) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_graphs_tools_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_graphs_tools_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_graphs_tools_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_graphs_tools_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/graphs_tools) | [![Open in Gitpod](https://raster.shields.io/static/v1?label=&message=try&color=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fmove%2Fgraphs_tools%2Fexamples%2Fgraphs_tools_trivial.rs,RUN_POSTFIX=--example%20graphs_tools_trivial/https://github.com/Wandalen/wTools) | +| [graphs_tools_deprecated](module/move/graphs_tools_deprecated) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_graphs_tools_deprecated_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_graphs_tools_deprecated_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_graphs_tools_deprecated_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_graphs_tools_deprecated_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/graphs_tools_deprecated) | [![Open in Gitpod](https://raster.shields.io/static/v1?label=&message=try&color=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fmove%2Fgraphs_tools_deprecated%2Fexamples%2Fgraphs_tools_trivial.rs,RUN_POSTFIX=--example%20graphs_tools_trivial/https://github.com/Wandalen/wTools) | +| [gspread](module/move/gspread) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_gspread_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_gspread_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_gspread_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_gspread_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/gspread) | | +| [llm_tools](module/move/llm_tools) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_llm_tools_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_llm_tools_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_llm_tools_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_llm_tools_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/llm_tools) | | | [optimization_tools](module/move/optimization_tools) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_optimization_tools_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_optimization_tools_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_optimization_tools_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_optimization_tools_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/optimization_tools) | [![Open in Gitpod](https://raster.shields.io/static/v1?label=&message=try&color=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fmove%2Foptimization_tools%2Fexamples%2Foptimization_tools_trivial.rs,RUN_POSTFIX=--example%20optimization_tools_trivial/https://github.com/Wandalen/wTools) | | [plot_interface](module/move/plot_interface) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_plot_interface_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_plot_interface_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_plot_interface_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_plot_interface_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/plot_interface) | | | [refiner](module/move/refiner) | [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_refiner_push.yml?label=&branch=master)](https://github.com/Wandalen/wTools/actions/workflows/module_refiner_push.yml?query=branch%3Amaster) | [![rust-status](https://img.shields.io/github/actions/workflow/status/Wandalen/wTools/module_refiner_push.yml?label=&branch=alpha)](https://github.com/Wandalen/wTools/actions/workflows/module_refiner_push.yml?query=branch%3Aalpha) | [![docs.rs](https://raster.shields.io/static/v1?label=&message=docs&color=eee)](https://docs.rs/refiner) | | diff --git a/module/alias/proc_macro_tools/Readme.md b/module/alias/proc_macro_tools/Readme.md index 4fa511924a..1d5fa53144 100644 --- a/module/alias/proc_macro_tools/Readme.md +++ b/module/alias/proc_macro_tools/Readme.md @@ -2,7 +2,7 @@ # Module :: proc_macro_tools - [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_proc_macro_tools_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_proc_macro_tools_push.yml) [![docs.rs](https://img.shields.io/docsrs/proc_macro_tools?color=e3e8f0&logo=docs.rs)](https://docs.rs/proc_macro_tools) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Falias%2Fproc_macro_tools%2Fexamples%2Fproc_macro_tools_trivial.rs,RUN_POSTFIX=--example%20proc_macro_tools_trivial/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_proc_macro_tools_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_proc_macro_tools_push.yml) [![docs.rs](https://img.shields.io/docsrs/proc_macro_tools?color=e3e8f0&logo=docs.rs)](https://docs.rs/proc_macro_tools) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Falias%2Fproc_macro_tools%2Fexamples%2Fproc_macro_tools_trivial.rs,RUN_POSTFIX=--example%20module%2Falias%2Fproc_macro_tools%2Fexamples%2Fproc_macro_tools_trivial.rs/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) Tools for writing procedural macros. diff --git a/module/alias/werror/Readme.md b/module/alias/werror/Readme.md index dc7e2b669a..f4b87ccaf6 100644 --- a/module/alias/werror/Readme.md +++ b/module/alias/werror/Readme.md @@ -2,7 +2,7 @@ # Module :: werror - [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_werror_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_werror_push.yml) [![docs.rs](https://img.shields.io/docsrs/werror?color=e3e8f0&logo=docs.rs)](https://docs.rs/werror) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Falias%2Fwerror%2Fexamples%2Fwerror_tools_trivial.rs,RUN_POSTFIX=--example%20werror_tools_trivial/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_werror_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_werror_push.yml) [![docs.rs](https://img.shields.io/docsrs/werror?color=e3e8f0&logo=docs.rs)](https://docs.rs/werror) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Falias%2Fwerror%2Fexamples%2Fwerror_tools_trivial.rs,RUN_POSTFIX=--example%20module%2Falias%2Fwerror%2Fexamples%2Fwerror_tools_trivial.rs/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) Basic exceptions handling mechanism. diff --git a/module/alias/winterval/Readme.md b/module/alias/winterval/Readme.md index a853161c8c..b26669fdc5 100644 --- a/module/alias/winterval/Readme.md +++ b/module/alias/winterval/Readme.md @@ -2,7 +2,7 @@ # Module :: winterval - [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_winterval_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_winterval_push.yml) [![docs.rs](https://img.shields.io/docsrs/winterval?color=e3e8f0&logo=docs.rs)](https://docs.rs/winterval) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Falias%2Fwinterval%2Fexamples%2Fwinterval_trivial.rs,RUN_POSTFIX=--example%20winterval_trivial/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_winterval_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_winterval_push.yml) [![docs.rs](https://img.shields.io/docsrs/winterval?color=e3e8f0&logo=docs.rs)](https://docs.rs/winterval) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Falias%2Fwinterval%2Fexamples%2Fwinterval_trivial.rs,RUN_POSTFIX=--example%20module%2Falias%2Fwinterval%2Fexamples%2Fwinterval_trivial.rs/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) Integer interval adapter for both Range and RangeInclusive. diff --git a/module/alias/wstring_tools/Readme.md b/module/alias/wstring_tools/Readme.md index ff1e2a4f75..68e309be8a 100644 --- a/module/alias/wstring_tools/Readme.md +++ b/module/alias/wstring_tools/Readme.md @@ -2,7 +2,7 @@ # Module :: wstring_tools - [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_wstring_tools_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_wstring_tools_push.yml) [![docs.rs](https://img.shields.io/docsrs/wstring_tools?color=e3e8f0&logo=docs.rs)](https://docs.rs/wstring_tools) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Falias%2Fwstring_tools%2Fexamples%2Fwstring_toolst_trivial_sample.rs,RUN_POSTFIX=--example%20wstring_toolst_trivial_sample/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_wstring_tools_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_wstring_tools_push.yml) [![docs.rs](https://img.shields.io/docsrs/wstring_tools?color=e3e8f0&logo=docs.rs)](https://docs.rs/wstring_tools) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Falias%2Fwstring_tools%2Fexamples%2Fwstring_toolst_trivial_sample.rs,RUN_POSTFIX=--example%20module%2Falias%2Fwstring_tools%2Fexamples%2Fwstring_toolst_trivial_sample.rs/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) Tools to manipulate strings. diff --git a/module/alias/wtest/Readme.md b/module/alias/wtest/Readme.md index 0f3d21c9a8..7fbe8a29fe 100644 --- a/module/alias/wtest/Readme.md +++ b/module/alias/wtest/Readme.md @@ -2,7 +2,7 @@ # Module :: wtest - [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_wtest_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_wtest_push.yml) [![docs.rs](https://img.shields.io/docsrs/wtest?color=e3e8f0&logo=docs.rs)](https://docs.rs/wtest) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Falias%2Fwtest%2Fexamples%2Fwtest_trivial_sample.rs,RUN_POSTFIX=--example%20wtest_trivial_sample/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_wtest_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_wtest_push.yml) [![docs.rs](https://img.shields.io/docsrs/wtest?color=e3e8f0&logo=docs.rs)](https://docs.rs/wtest) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Falias%2Fwtest%2Fexamples%2Fwtest_trivial_sample.rs,RUN_POSTFIX=--example%20module%2Falias%2Fwtest%2Fexamples%2Fwtest_trivial_sample.rs/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) Tools for writing and running tests. diff --git a/module/core/clone_dyn/Readme.md b/module/core/clone_dyn/Readme.md index 43e159b62c..331eeb7b8b 100644 --- a/module/core/clone_dyn/Readme.md +++ b/module/core/clone_dyn/Readme.md @@ -1,7 +1,7 @@ # Module :: clone_dyn - [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_clone_dyn_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_clone_dyn_push.yml) [![docs.rs](https://img.shields.io/docsrs/clone_dyn?color=e3e8f0&logo=docs.rs)](https://docs.rs/clone_dyn) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Fclone_dyn%2Fexamples%2Fclone_dyn_trivial.rs,RUN_POSTFIX=--example%20clone_dyn_trivial/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_clone_dyn_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_clone_dyn_push.yml) [![docs.rs](https://img.shields.io/docsrs/clone_dyn?color=e3e8f0&logo=docs.rs)](https://docs.rs/clone_dyn) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Fclone_dyn%2Fexamples%2Fclone_dyn_trivial.rs,RUN_POSTFIX=--example%20module%2Fcore%2Fclone_dyn%2Fexamples%2Fclone_dyn_trivial.rs/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) Derive to clone dyn structures. diff --git a/module/core/clone_dyn_types/Readme.md b/module/core/clone_dyn_types/Readme.md index 0a3caaae26..a00356dfd2 100644 --- a/module/core/clone_dyn_types/Readme.md +++ b/module/core/clone_dyn_types/Readme.md @@ -1,7 +1,7 @@ # Module :: `clone_dyn_types` - [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_clone_dyn_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_clone_dyn_push.yml) [![docs.rs](https://img.shields.io/docsrs/clone_dyn_types?color=e3e8f0&logo=docs.rs)](https://docs.rs/clone_dyn_types) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Fclone_dyn%2Fexamples%2Fclone_dyn_trivial.rs,RUN_POSTFIX=--example%20clone_dyn_trivial/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_clone_dyn_types_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_clone_dyn_types_push.yml) [![docs.rs](https://img.shields.io/docsrs/clone_dyn_types?color=e3e8f0&logo=docs.rs)](https://docs.rs/clone_dyn_types) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Fclone_dyn_types%2Fexamples%2Fclone_dyn_types_trivial.rs,RUN_POSTFIX=--example%20module%2Fcore%2Fclone_dyn_types%2Fexamples%2Fclone_dyn_types_trivial.rs/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) Derive to clone dyn structures. diff --git a/module/core/collection_tools/Readme.md b/module/core/collection_tools/Readme.md index b247a692b0..fadff95c94 100644 --- a/module/core/collection_tools/Readme.md +++ b/module/core/collection_tools/Readme.md @@ -2,7 +2,7 @@ # Module :: `collection_tools` - [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_collection_tools_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_collection_tools_push.yml) [![docs.rs](https://img.shields.io/docsrs/collection_tools?color=e3e8f0&logo=docs.rs)](https://docs.rs/collection_tools) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Fcollection_tools%2Fexamples%2Fcollection_tools_trivial.rs,RUN_POSTFIX=--example%20collection_tools_trivial/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_collection_tools_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_collection_tools_push.yml) [![docs.rs](https://img.shields.io/docsrs/collection_tools?color=e3e8f0&logo=docs.rs)](https://docs.rs/collection_tools) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Fcollection_tools%2Fexamples%2Fcollection_tools_trivial.rs,RUN_POSTFIX=--example%20module%2Fcore%2Fcollection_tools%2Fexamples%2Fcollection_tools_trivial.rs/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) General purpose tools to manipulate collections( containers like Vec/HashMap/HashSet... ). diff --git a/module/core/data_type/Readme.md b/module/core/data_type/Readme.md index f0f82dd4a8..a9ad7698f7 100644 --- a/module/core/data_type/Readme.md +++ b/module/core/data_type/Readme.md @@ -2,7 +2,7 @@ # Module :: `data_type` - [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_data_type_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_data_type_push.yml) [![docs.rs](https://img.shields.io/docsrs/data_type?color=e3e8f0&logo=docs.rs)](https://docs.rs/data_type) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Fdata_type%2Fexamples%2Fdata_type_trivial.rs,RUN_POSTFIX=--example%20data_type_trivial/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_data_type_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_data_type_push.yml) [![docs.rs](https://img.shields.io/docsrs/data_type?color=e3e8f0&logo=docs.rs)](https://docs.rs/data_type) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Fdata_type%2Fexamples%2Fdata_type_trivial.rs,RUN_POSTFIX=--example%20module%2Fcore%2Fdata_type%2Fexamples%2Fdata_type_trivial.rs/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) Collection of primal data types. diff --git a/module/core/derive_tools/Readme.md b/module/core/derive_tools/Readme.md index f5e6fddf2e..a45cb3a745 100644 --- a/module/core/derive_tools/Readme.md +++ b/module/core/derive_tools/Readme.md @@ -2,7 +2,7 @@ - [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_derive_tools_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_derive_tools_push.yml) [![docs.rs](https://img.shields.io/docsrs/derive_tools?color=e3e8f0&logo=docs.rs)](https://docs.rs/derive_tools) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Fderive_tools%2Fexamples%2Fderive_tools_trivial.rs,RUN_POSTFIX=--example%20derive_tools_trivial/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_derive_tools_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_derive_tools_push.yml) [![docs.rs](https://img.shields.io/docsrs/derive_tools?color=e3e8f0&logo=docs.rs)](https://docs.rs/derive_tools) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Fderive_tools%2Fexamples%2Fderive_tools_trivial.rs,RUN_POSTFIX=--example%20module%2Fcore%2Fderive_tools%2Fexamples%2Fderive_tools_trivial.rs/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) ### Basic use-case diff --git a/module/core/diagnostics_tools/Readme.md b/module/core/diagnostics_tools/Readme.md index d41d9b75a5..94cd00fc4a 100644 --- a/module/core/diagnostics_tools/Readme.md +++ b/module/core/diagnostics_tools/Readme.md @@ -2,7 +2,7 @@ # Module :: diagnostics_tools - [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_diagnostics_tools_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_diagnostics_tools_push.yml) [![docs.rs](https://img.shields.io/docsrs/diagnostics_tools?color=e3e8f0&logo=docs.rs)](https://docs.rs/diagnostics_tools) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Fdiagnostics_tools%2Fexamples%2Fdiagnostics_tools_trivial.rs,RUN_POSTFIX=--example%20diagnostics_tools_trivial/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_diagnostics_tools_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_diagnostics_tools_push.yml) [![docs.rs](https://img.shields.io/docsrs/diagnostics_tools?color=e3e8f0&logo=docs.rs)](https://docs.rs/diagnostics_tools) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Fdiagnostics_tools%2Fexamples%2Fdiagnostics_tools_trivial.rs,RUN_POSTFIX=--example%20module%2Fcore%2Fdiagnostics_tools%2Fexamples%2Fdiagnostics_tools_trivial.rs/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) Diagnostics tools. diff --git a/module/core/error_tools/Readme.md b/module/core/error_tools/Readme.md index f5e679a074..3fabec16b9 100644 --- a/module/core/error_tools/Readme.md +++ b/module/core/error_tools/Readme.md @@ -2,7 +2,7 @@ # Module :: `error_tools` - [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_error_tools_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_error_tools_push.yml) [![docs.rs](https://img.shields.io/docsrs/error_tools?color=e3e8f0&logo=docs.rs)](https://docs.rs/error_tools) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Ferror_tools%2Fexamples%2Ferror_tools_trivial.rs,RUN_POSTFIX=--example%20error_tools_trivial/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_error_tools_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_error_tools_push.yml) [![docs.rs](https://img.shields.io/docsrs/error_tools?color=e3e8f0&logo=docs.rs)](https://docs.rs/error_tools) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Ferror_tools%2Fexamples%2Ferror_tools_trivial.rs,RUN_POSTFIX=--example%20module%2Fcore%2Ferror_tools%2Fexamples%2Ferror_tools_trivial.rs/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) Basic exceptions handling mechanism. diff --git a/module/core/for_each/Readme.md b/module/core/for_each/Readme.md index eb0d2e3d5e..ed57cd123b 100644 --- a/module/core/for_each/Readme.md +++ b/module/core/for_each/Readme.md @@ -2,7 +2,7 @@ # Module :: for_each - [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_for_each_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_for_each_push.yml) [![docs.rs](https://img.shields.io/docsrs/for_each?color=e3e8f0&logo=docs.rs)](https://docs.rs/for_each) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Ffor_each%2Fexamples%2Ffor_each_trivial.rs,RUN_POSTFIX=--example%20for_each_trivial/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_for_each_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_for_each_push.yml) [![docs.rs](https://img.shields.io/docsrs/for_each?color=e3e8f0&logo=docs.rs)](https://docs.rs/for_each) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Ffor_each%2Fexamples%2Ffor_each_trivial.rs,RUN_POSTFIX=--example%20module%2Fcore%2Ffor_each%2Fexamples%2Ffor_each_trivial.rs/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) Apply a macro for each element of a list. diff --git a/module/core/format_tools/Readme.md b/module/core/format_tools/Readme.md index 6fe6e41b5f..e298c5a5db 100644 --- a/module/core/format_tools/Readme.md +++ b/module/core/format_tools/Readme.md @@ -1,7 +1,7 @@ # Module :: format_tools - [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_reflect_tools_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_reflect_tools_push.yml) [![docs.rs](https://img.shields.io/docsrs/format_tools?color=e3e8f0&logo=docs.rs)](https://docs.rs/format_tools) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Freflect_tools%2Fexamples%2Freflect_tools_trivial.rs,RUN_POSTFIX=--example%20reflect_tools_trivial/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_format_tools_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_format_tools_push.yml) [![docs.rs](https://img.shields.io/docsrs/format_tools?color=e3e8f0&logo=docs.rs)](https://docs.rs/format_tools) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Fformat_tools%2Fexamples%2Fformat_tools_trivial.rs,RUN_POSTFIX=--example%20module%2Fcore%2Fformat_tools%2Fexamples%2Fformat_tools_trivial.rs/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) Collection of mechanisms for formatting and serialization into string. diff --git a/module/core/former/Readme.md b/module/core/former/Readme.md index 0e429ab46b..6a71d6bb3e 100644 --- a/module/core/former/Readme.md +++ b/module/core/former/Readme.md @@ -2,7 +2,7 @@ # Module :: former - [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_former_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_former_push.yml) [![docs.rs](https://img.shields.io/docsrs/former?color=e3e8f0&logo=docs.rs)](https://docs.rs/former) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Fformer%2Fexamples%2Fformer_trivial.rs,RUN_POSTFIX=--example%20former_trivial/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_former_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_former_push.yml) [![docs.rs](https://img.shields.io/docsrs/former?color=e3e8f0&logo=docs.rs)](https://docs.rs/former) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Fformer%2Fexamples%2Fformer_trivial.rs,RUN_POSTFIX=--example%20module%2Fcore%2Fformer%2Fexamples%2Fformer_trivial.rs/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) A flexible implementation of the Builder pattern supporting nested builders and collection-specific subformers. diff --git a/module/core/former_types/Readme.md b/module/core/former_types/Readme.md index 742285fb8b..0d1635fab1 100644 --- a/module/core/former_types/Readme.md +++ b/module/core/former_types/Readme.md @@ -3,7 +3,7 @@ # Module :: `former_types` - [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_former_types_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_former_types_push.yml) [![docs.rs](https://img.shields.io/docsrs/former_types?color=e3e8f0&logo=docs.rs)](https://docs.rs/former_types) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Fformer_types%2Fexamples%2Fformer_types_trivial.rs,RUN_POSTFIX=--example%20former_types_trivial/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_former_types_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_former_types_push.yml) [![docs.rs](https://img.shields.io/docsrs/former_types?color=e3e8f0&logo=docs.rs)](https://docs.rs/former_types) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Fformer_types%2Fexamples%2Fformer_types_trivial.rs,RUN_POSTFIX=--example%20module%2Fcore%2Fformer_types%2Fexamples%2Fformer_types_trivial.rs/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) A flexible implementation of the Builder pattern supporting nested builders and collection-specific subformers. Its compile-time structures and traits that are not generated but reused. diff --git a/module/core/implements/Readme.md b/module/core/implements/Readme.md index 8fe784a119..7ebc582300 100644 --- a/module/core/implements/Readme.md +++ b/module/core/implements/Readme.md @@ -2,7 +2,7 @@ # Module :: implements - [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_implements_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_implements_push.yml) [![docs.rs](https://img.shields.io/docsrs/implements?color=e3e8f0&logo=docs.rs)](https://docs.rs/implements) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Fimplements%2Fexamples%2Fimplements_trivial.rs,RUN_POSTFIX=--example%20implements_trivial/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_implements_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_implements_push.yml) [![docs.rs](https://img.shields.io/docsrs/implements?color=e3e8f0&logo=docs.rs)](https://docs.rs/implements) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Fimplements%2Fexamples%2Fimplements_trivial.rs,RUN_POSTFIX=--example%20module%2Fcore%2Fimplements%2Fexamples%2Fimplements_trivial.rs/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) Macro to answer the question: does it implement a trait? diff --git a/module/core/impls_index/Readme.md b/module/core/impls_index/Readme.md index 39573c49bd..7a92991717 100644 --- a/module/core/impls_index/Readme.md +++ b/module/core/impls_index/Readme.md @@ -2,7 +2,7 @@ # Module :: impls_index - [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_impls_index_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_impls_index_push.yml) [![docs.rs](https://img.shields.io/docsrs/impls_index?color=e3e8f0&logo=docs.rs)](https://docs.rs/impls_index) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Fimpls_index%2Fexamples%2Fimpls_index_trivial.rs,RUN_POSTFIX=--example%20impls_index_trivial/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_impls_index_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_impls_index_push.yml) [![docs.rs](https://img.shields.io/docsrs/impls_index?color=e3e8f0&logo=docs.rs)](https://docs.rs/impls_index) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Fimpls_index%2Fexamples%2Fimpls_index_trivial.rs,RUN_POSTFIX=--example%20module%2Fcore%2Fimpls_index%2Fexamples%2Fimpls_index_trivial.rs/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) Several of macros to put each function under a named macro to index every function in a class. diff --git a/module/core/inspect_type/Readme.md b/module/core/inspect_type/Readme.md index e45df40b25..c123b0cc19 100644 --- a/module/core/inspect_type/Readme.md +++ b/module/core/inspect_type/Readme.md @@ -2,7 +2,7 @@ # Module :: inspect_type - [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_inspect_type_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_inspect_type_push.yml) [![docs.rs](https://img.shields.io/docsrs/inspect_type?color=e3e8f0&logo=docs.rs)](https://docs.rs/inspect_type) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Finspect_type%2Fexamples%2Finspect_type_trivial.rs,RUN_POSTFIX=--example%20inspect_type_trivial/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_inspect_type_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_inspect_type_push.yml) [![docs.rs](https://img.shields.io/docsrs/inspect_type?color=e3e8f0&logo=docs.rs)](https://docs.rs/inspect_type) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Finspect_type%2Fexamples%2Finspect_type_trivial.rs,RUN_POSTFIX=--example%20module%2Fcore%2Finspect_type%2Fexamples%2Finspect_type_trivial.rs/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) Diagnostic-purpose tools to inspect type of a variable and its size. diff --git a/module/core/interval_adapter/Readme.md b/module/core/interval_adapter/Readme.md index f1d171804d..4ad064b2fc 100644 --- a/module/core/interval_adapter/Readme.md +++ b/module/core/interval_adapter/Readme.md @@ -2,7 +2,7 @@ # Module :: `interval_adapter` - [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_interval_adapter_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_interval_adapter_push.yml) [![docs.rs](https://img.shields.io/docsrs/interval_adapter?color=e3e8f0&logo=docs.rs)](https://docs.rs/interval_adapter) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Finterval_adapter%2Fexamples%2Finterval_adapter_trivial.rs,RUN_POSTFIX=--example%20interval_adapter_trivial/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_interval_adapter_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_interval_adapter_push.yml) [![docs.rs](https://img.shields.io/docsrs/interval_adapter?color=e3e8f0&logo=docs.rs)](https://docs.rs/interval_adapter) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Finterval_adapter%2Fexamples%2Finterval_adapter_trivial.rs,RUN_POSTFIX=--example%20module%2Fcore%2Finterval_adapter%2Fexamples%2Finterval_adapter_trivial.rs/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) Integer interval adapter for both Range and `RangeInclusive`. diff --git a/module/core/is_slice/Readme.md b/module/core/is_slice/Readme.md index cd6d9eadac..d4440be29b 100644 --- a/module/core/is_slice/Readme.md +++ b/module/core/is_slice/Readme.md @@ -2,7 +2,7 @@ # Module :: is_slice - [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_is_slice_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_is_slice_push.yml) [![docs.rs](https://img.shields.io/docsrs/is_slice?color=e3e8f0&logo=docs.rs)](https://docs.rs/is_slice) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Fis_slice%2Fexamples%2Fis_slice_trivial.rs,RUN_POSTFIX=--example%20is_slice_trivial/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_is_slice_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_is_slice_push.yml) [![docs.rs](https://img.shields.io/docsrs/is_slice?color=e3e8f0&logo=docs.rs)](https://docs.rs/is_slice) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Fis_slice%2Fexamples%2Fis_slice_trivial.rs,RUN_POSTFIX=--example%20module%2Fcore%2Fis_slice%2Fexamples%2Fis_slice_trivial.rs/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) Macro to answer the question: is it a slice? diff --git a/module/core/iter_tools/Readme.md b/module/core/iter_tools/Readme.md index cafefb8cc7..c4f8e91780 100644 --- a/module/core/iter_tools/Readme.md +++ b/module/core/iter_tools/Readme.md @@ -2,7 +2,7 @@ # Module :: `iter_tools` - [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_iter_tools_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_iter_tools_push.yml) [![docs.rs](https://img.shields.io/docsrs/iter_tools?color=e3e8f0&logo=docs.rs)](https://docs.rs/iter_tools) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Fiter_tools%2Fexamples%2Fiter_tools_trivial.rs,RUN_POSTFIX=--example%20iter_tools_trivial/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_iter_tools_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_iter_tools_push.yml) [![docs.rs](https://img.shields.io/docsrs/iter_tools?color=e3e8f0&logo=docs.rs)](https://docs.rs/iter_tools) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Fiter_tools%2Fexamples%2Fiter_tools_trivial.rs,RUN_POSTFIX=--example%20module%2Fcore%2Fiter_tools%2Fexamples%2Fiter_tools_trivial.rs/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) Collection of general purpose tools to iterate. Currently it simply reexports itertools. diff --git a/module/core/macro_tools/Readme.md b/module/core/macro_tools/Readme.md index 8cb337367c..37d574ccd1 100644 --- a/module/core/macro_tools/Readme.md +++ b/module/core/macro_tools/Readme.md @@ -2,7 +2,7 @@ # Module :: `proc_macro_tools` - [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_macro_tools_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_macro_tools_push.yml) [![docs.rs](https://img.shields.io/docsrs/macro_tools?color=e3e8f0&logo=docs.rs)](https://docs.rs/macro_tools) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Fmacro_tools%2Fexamples%2Fmacro_tools_trivial.rs,RUN_POSTFIX=--example%20macro_tools_trivial/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_macro_tools_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_macro_tools_push.yml) [![docs.rs](https://img.shields.io/docsrs/macro_tools?color=e3e8f0&logo=docs.rs)](https://docs.rs/macro_tools) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Fmacro_tools%2Fexamples%2Fmacro_tools_trivial.rs,RUN_POSTFIX=--example%20module%2Fcore%2Fmacro_tools%2Fexamples%2Fmacro_tools_trivial.rs/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) Tools for writing procedural macros. diff --git a/module/core/mem_tools/Readme.md b/module/core/mem_tools/Readme.md index 96f5ae9605..6d35a9253a 100644 --- a/module/core/mem_tools/Readme.md +++ b/module/core/mem_tools/Readme.md @@ -2,7 +2,7 @@ # Module :: mem_tools - [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_mem_tools_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_mem_tools_push.yml) [![docs.rs](https://img.shields.io/docsrs/mem_tools?color=e3e8f0&logo=docs.rs)](https://docs.rs/mem_tools) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Fmem_tools%2Fexamples%2Fmem_tools_trivial.rs,RUN_POSTFIX=--example%20mem_tools_trivial/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_mem_tools_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_mem_tools_push.yml) [![docs.rs](https://img.shields.io/docsrs/mem_tools?color=e3e8f0&logo=docs.rs)](https://docs.rs/mem_tools) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Fmem_tools%2Fexamples%2Fmem_tools_trivial.rs,RUN_POSTFIX=--example%20module%2Fcore%2Fmem_tools%2Fexamples%2Fmem_tools_trivial.rs/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) Collection of tools to manipulate memory. diff --git a/module/core/meta_tools/Readme.md b/module/core/meta_tools/Readme.md index c43c980e94..76c8cfcf19 100644 --- a/module/core/meta_tools/Readme.md +++ b/module/core/meta_tools/Readme.md @@ -2,7 +2,7 @@ # Module :: meta_tools - [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_meta_tools_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_meta_tools_push.yml) [![docs.rs](https://img.shields.io/docsrs/meta_tools?color=e3e8f0&logo=docs.rs)](https://docs.rs/meta_tools) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Fmeta_tools%2Fexamples%2Fmeta_tools_trivial.rs,RUN_POSTFIX=--example%20meta_tools_trivial/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_meta_tools_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_meta_tools_push.yml) [![docs.rs](https://img.shields.io/docsrs/meta_tools?color=e3e8f0&logo=docs.rs)](https://docs.rs/meta_tools) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Fmeta_tools%2Fexamples%2Fmeta_tools_trivial.rs,RUN_POSTFIX=--example%20module%2Fcore%2Fmeta_tools%2Fexamples%2Fmeta_tools_trivial.rs/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) Collection of general purpose meta tools. diff --git a/module/core/reflect_tools/Readme.md b/module/core/reflect_tools/Readme.md index 624cab03ac..a669ce27d4 100644 --- a/module/core/reflect_tools/Readme.md +++ b/module/core/reflect_tools/Readme.md @@ -1,7 +1,7 @@ # Module :: reflect_tools - [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_reflect_tools_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_reflect_tools_push.yml) [![docs.rs](https://img.shields.io/docsrs/reflect_tools?color=e3e8f0&logo=docs.rs)](https://docs.rs/reflect_tools) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Freflect_tools%2Fexamples%2Freflect_tools_trivial.rs,RUN_POSTFIX=--example%20reflect_tools_trivial/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_reflect_tools_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_reflect_tools_push.yml) [![docs.rs](https://img.shields.io/docsrs/reflect_tools?color=e3e8f0&logo=docs.rs)](https://docs.rs/reflect_tools) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Freflect_tools%2Fexamples%2Freflect_tools_trivial.rs,RUN_POSTFIX=--example%20module%2Fcore%2Freflect_tools%2Fexamples%2Freflect_tools_trivial.rs/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) ### Basic use-case diff --git a/module/core/strs_tools/Readme.md b/module/core/strs_tools/Readme.md index 84edff0798..2f8bab872e 100644 --- a/module/core/strs_tools/Readme.md +++ b/module/core/strs_tools/Readme.md @@ -2,7 +2,7 @@ # Module :: `strs_tools` - [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_strs_tools_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_strs_tools_push.yml) [![docs.rs](https://img.shields.io/docsrs/strs_tools?color=e3e8f0&logo=docs.rs)](https://docs.rs/strs_tools) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Fstrs_tools%2Fexamples%2Fstrs_tools_trivial.rs,RUN_POSTFIX=--example%20strs_tools_trivial/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_strs_tools_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_strs_tools_push.yml) [![docs.rs](https://img.shields.io/docsrs/strs_tools?color=e3e8f0&logo=docs.rs)](https://docs.rs/strs_tools) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Fstrs_tools%2Fexamples%2Fstrs_tools_trivial.rs,RUN_POSTFIX=--example%20module%2Fcore%2Fstrs_tools%2Fexamples%2Fstrs_tools_trivial.rs/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) Tools to manipulate strings. diff --git a/module/core/test_tools/Readme.md b/module/core/test_tools/Readme.md index e54c622c81..cdb666da61 100644 --- a/module/core/test_tools/Readme.md +++ b/module/core/test_tools/Readme.md @@ -2,7 +2,7 @@ # Module :: test_tools - [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_test_tools_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_test_tools_push.yml) [![docs.rs](https://img.shields.io/docsrs/test_tools?color=e3e8f0&logo=docs.rs)](https://docs.rs/test_tools) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Ftest_tools%2Fexamples%2Ftest_tools_trivial.rs,RUN_POSTFIX=--example%20test_tools_trivial/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_test_tools_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_test_tools_push.yml) [![docs.rs](https://img.shields.io/docsrs/test_tools?color=e3e8f0&logo=docs.rs)](https://docs.rs/test_tools) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Ftest_tools%2Fexamples%2Ftest_tools_trivial.rs,RUN_POSTFIX=--example%20module%2Fcore%2Ftest_tools%2Fexamples%2Ftest_tools_trivial.rs/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) Tools for writing and running tests. diff --git a/module/core/time_tools/Readme.md b/module/core/time_tools/Readme.md index 903a8482e0..01bc1d87d8 100644 --- a/module/core/time_tools/Readme.md +++ b/module/core/time_tools/Readme.md @@ -2,7 +2,7 @@ # Module :: time_tools - [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_time_tools_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_time_tools_push.yml) [![docs.rs](https://img.shields.io/docsrs/time_tools?color=e3e8f0&logo=docs.rs)](https://docs.rs/time_tools) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Ftime_tools%2Fexamples%2Ftime_tools_trivial.rs,RUN_POSTFIX=--example%20time_tools_trivial/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_time_tools_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_time_tools_push.yml) [![docs.rs](https://img.shields.io/docsrs/time_tools?color=e3e8f0&logo=docs.rs)](https://docs.rs/time_tools) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Ftime_tools%2Fexamples%2Ftime_tools_trivial.rs,RUN_POSTFIX=--example%20module%2Fcore%2Ftime_tools%2Fexamples%2Ftime_tools_trivial.rs/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) Collection of general purpose time tools. diff --git a/module/core/typing_tools/Readme.md b/module/core/typing_tools/Readme.md index 33bd604df3..0424723d24 100644 --- a/module/core/typing_tools/Readme.md +++ b/module/core/typing_tools/Readme.md @@ -2,7 +2,7 @@ # Module :: typing_tools - [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_typing_tools_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_typing_tools_push.yml) [![docs.rs](https://img.shields.io/docsrs/typing_tools?color=e3e8f0&logo=docs.rs)](https://docs.rs/typing_tools) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Ftyping_tools%2Fexamples%2Ftyping_tools_trivial.rs,RUN_POSTFIX=--example%20typing_tools_trivial/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_typing_tools_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_typing_tools_push.yml) [![docs.rs](https://img.shields.io/docsrs/typing_tools?color=e3e8f0&logo=docs.rs)](https://docs.rs/typing_tools) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Ftyping_tools%2Fexamples%2Ftyping_tools_trivial.rs,RUN_POSTFIX=--example%20module%2Fcore%2Ftyping_tools%2Fexamples%2Ftyping_tools_trivial.rs/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) Collection of general purpose tools for type checking. diff --git a/module/core/variadic_from/Readme.md b/module/core/variadic_from/Readme.md index 1389bf6828..efaf398569 100644 --- a/module/core/variadic_from/Readme.md +++ b/module/core/variadic_from/Readme.md @@ -1,7 +1,7 @@ # Module :: variadic_from - [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_variadic_from_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_variadic_from_push.yml) [![docs.rs](https://img.shields.io/docsrs/variadic_from?color=e3e8f0&logo=docs.rs)](https://docs.rs/variadic_from) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Fvariadic_from%2Fexamples%2Fvariadic_from_trivial.rs,RUN_POSTFIX=--example%20variadic_from_trivial/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_variadic_from_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_variadic_from_push.yml) [![docs.rs](https://img.shields.io/docsrs/variadic_from?color=e3e8f0&logo=docs.rs)](https://docs.rs/variadic_from) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Fvariadic_from%2Fexamples%2Fvariadic_from_trivial.rs,RUN_POSTFIX=--example%20module%2Fcore%2Fvariadic_from%2Fexamples%2Fvariadic_from_trivial.rs/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) The variadic from is designed to provide a way to implement the From-like traits for structs with a variable number of fields, allowing them to be constructed from tuples of different lengths or from individual arguments. This functionality is particularly useful for creating flexible constructors that enable different methods of instantiation for a struct. By automating the implementation of traits crate reduces boilerplate code and enhances code readability and maintainability. diff --git a/module/core/wtools/Readme.md b/module/core/wtools/Readme.md index 114861dea7..2f5552fc91 100644 --- a/module/core/wtools/Readme.md +++ b/module/core/wtools/Readme.md @@ -2,7 +2,7 @@ # Module :: wtools - [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_wtools_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_wtools_push.yml) [![docs.rs](https://img.shields.io/docsrs/wtools?color=e3e8f0&logo=docs.rs)](https://docs.rs/wtools) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Fwtools%2Fexamples%2Fwtools_trivial.rs,RUN_POSTFIX=--example%20wtools_trivial/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_wtools_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_wtools_push.yml) [![docs.rs](https://img.shields.io/docsrs/wtools?color=e3e8f0&logo=docs.rs)](https://docs.rs/wtools) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fcore%2Fwtools%2Fexamples%2Fwtools_trivial.rs,RUN_POSTFIX=--example%20module%2Fcore%2Fwtools%2Fexamples%2Fwtools_trivial.rs/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) Collection of general purpose tools for solving problems. Fundamentally extend the language without spoiling, so may be used solely or in conjunction with another module of such kind. diff --git a/module/move/crates_tools/Readme.md b/module/move/crates_tools/Readme.md index f407d2599e..f7751cb4ab 100644 --- a/module/move/crates_tools/Readme.md +++ b/module/move/crates_tools/Readme.md @@ -2,7 +2,7 @@ # Module :: `crates_tools` - [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_crates_tools_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_crates_tools_push.yml) [![docs.rs](https://img.shields.io/docsrs/crates_tools?color=e3e8f0&logo=docs.rs)](https://docs.rs/crates_tools) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fmove%2Fcrates_tools%2Fexamples%2Fcrates_tools_trivial.rs,RUN_POSTFIX=--example%20crates_tools_trivial/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_crates_tools_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_crates_tools_push.yml) [![docs.rs](https://img.shields.io/docsrs/crates_tools?color=e3e8f0&logo=docs.rs)](https://docs.rs/crates_tools) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fmove%2Fcrates_tools%2Fexamples%2Fcrates_tools_trivial.rs,RUN_POSTFIX=--example%20module%2Fmove%2Fcrates_tools%2Fexamples%2Fcrates_tools_trivial.rs/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) Tools to analyse crate files. diff --git a/module/move/deterministic_rand/Readme.md b/module/move/deterministic_rand/Readme.md index 4d52d1cc38..54b6c809ed 100644 --- a/module/move/deterministic_rand/Readme.md +++ b/module/move/deterministic_rand/Readme.md @@ -2,7 +2,7 @@ - [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_deterministic_rand_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_deterministic_rand_push.yml) [![docs.rs](https://img.shields.io/docsrs/deterministic_rand?color=e3e8f0&logo=docs.rs)](https://docs.rs/deterministic_rand) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fmove%2Fdeterministic_rand%2Fexamples%2Fdeterministic_rand_trivial.rs,RUN_POSTFIX=--example%20deterministic_rand_trivial/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_deterministic_rand_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_deterministic_rand_push.yml) [![docs.rs](https://img.shields.io/docsrs/deterministic_rand?color=e3e8f0&logo=docs.rs)](https://docs.rs/deterministic_rand) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fmove%2Fdeterministic_rand%2Fexamples%2Fdeterministic_rand_trivial.rs,RUN_POSTFIX=--example%20module%2Fmove%2Fdeterministic_rand%2Fexamples%2Fdeterministic_rand_trivial.rs/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) Hierarchical random number generators for concurrent simulations with switchable determinism. diff --git a/module/move/graphs_tools/Readme.md b/module/move/graphs_tools/Readme.md index 07a0274fe4..7d87413ba4 100644 --- a/module/move/graphs_tools/Readme.md +++ b/module/move/graphs_tools/Readme.md @@ -2,7 +2,7 @@ # Module :: graphs_tools - [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_graphs_tools_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_graphs_tools_push.yml) [![docs.rs](https://img.shields.io/docsrs/graphs_tools?color=e3e8f0&logo=docs.rs)](https://docs.rs/graphs_tools) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fmove%2Fgraphs_tools%2Fexamples%2Fgraphs_tools_trivial.rs,RUN_POSTFIX=--example%20graphs_tools_trivial/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_graphs_tools_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_graphs_tools_push.yml) [![docs.rs](https://img.shields.io/docsrs/graphs_tools?color=e3e8f0&logo=docs.rs)](https://docs.rs/graphs_tools) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fmove%2Fgraphs_tools%2Fexamples%2Fgraphs_tools_trivial.rs,RUN_POSTFIX=--example%20module%2Fmove%2Fgraphs_tools%2Fexamples%2Fgraphs_tools_trivial.rs/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) **NOT ready for production** diff --git a/module/move/graphs_tools_deprecated/Readme.md b/module/move/graphs_tools_deprecated/Readme.md index 07a0274fe4..88273b115b 100644 --- a/module/move/graphs_tools_deprecated/Readme.md +++ b/module/move/graphs_tools_deprecated/Readme.md @@ -2,7 +2,7 @@ # Module :: graphs_tools - [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_graphs_tools_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_graphs_tools_push.yml) [![docs.rs](https://img.shields.io/docsrs/graphs_tools?color=e3e8f0&logo=docs.rs)](https://docs.rs/graphs_tools) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fmove%2Fgraphs_tools%2Fexamples%2Fgraphs_tools_trivial.rs,RUN_POSTFIX=--example%20graphs_tools_trivial/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_graphs_tools_deprecated_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_graphs_tools_deprecated_push.yml) [![docs.rs](https://img.shields.io/docsrs/graphs_tools_deprecated?color=e3e8f0&logo=docs.rs)](https://docs.rs/graphs_tools_deprecated) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fmove%2Fgraphs_tools_deprecated%2Fexamples%2Fgraphs_tools_trivial.rs,RUN_POSTFIX=--example%20module%2Fmove%2Fgraphs_tools_deprecated%2Fexamples%2Fgraphs_tools_trivial.rs/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) **NOT ready for production** diff --git a/module/move/wca/Readme.md b/module/move/wca/Readme.md index ecda885b57..2e5ffafd27 100644 --- a/module/move/wca/Readme.md +++ b/module/move/wca/Readme.md @@ -2,7 +2,7 @@ # Module :: wca - [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_wca_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_wca_push.yml) [![docs.rs](https://img.shields.io/docsrs/wca?color=e3e8f0&logo=docs.rs)](https://docs.rs/wca) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fmove%2Fwca%2Fexamples%2Fwca_trivial.rs,RUN_POSTFIX=--example%20wca_trivial/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) + [![experimental](https://raster.shields.io/static/v1?label=&message=experimental&color=orange)](https://github.com/emersion/stability-badges#experimental) [![rust-status](https://github.com/Wandalen/wTools/actions/workflows/module_wca_push.yml/badge.svg)](https://github.com/Wandalen/wTools/actions/workflows/module_wca_push.yml) [![docs.rs](https://img.shields.io/docsrs/wca?color=e3e8f0&logo=docs.rs)](https://docs.rs/wca) [![Open in Gitpod](https://raster.shields.io/static/v1?label=try&message=online&color=eee&logo=gitpod&logoColor=eee)](https://gitpod.io/#RUN_PATH=.,SAMPLE_FILE=module%2Fmove%2Fwca%2Fexamples%2Fwca_trivial.rs,RUN_POSTFIX=--example%20module%2Fmove%2Fwca%2Fexamples%2Fwca_trivial.rs/https://github.com/Wandalen/wTools) [![discord](https://img.shields.io/discord/872391416519737405?color=eee&logo=discord&logoColor=eee&label=ask)](https://discord.gg/m3YfbXpUUY) The tool to make CLI ( commands user interface ). It is able to aggregate external binary applications, as well as functions, which are written in your language. From a2ee6539a64d8ce75cfb505f5fd4ddb5df31ff64 Mon Sep 17 00:00:00 2001 From: wandalen Date: Tue, 8 Apr 2025 08:10:30 +0300 Subject: [PATCH 7/7] add asbytes to cargo file of workspace --- Cargo.toml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Cargo.toml b/Cargo.toml index 46bd5a35d0..20e07892bb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -336,6 +336,11 @@ version = "~0.12.0" path = "module/core/is_slice" default-features = false +[workspace.dependencies.asbytes] +version = "~0.1.0" +path = "module/core/asbytes" +default-features = false + ## error