Hone logo
Hone
Problems

Implementing a Simple String Transformation Macro in Rust

Macro rules in Rust provide a powerful mechanism for code generation, allowing you to write concise and reusable code. This challenge asks you to implement a macro that transforms a string literal into a new string literal by applying a simple character replacement rule. This exercise will help you understand the basics of macro syntax, pattern matching, and code generation within macros.

Problem Description

You are tasked with creating a Rust macro named transform_string that takes a string literal as input and replaces all occurrences of a specified character with another specified character. The macro should accept three arguments: the string literal to transform, the character to be replaced, and the character to replace it with. The macro should then expand to a new string literal containing the transformed string.

Key Requirements:

  • The macro must accept three arguments: string_literal, old_char, and new_char.
  • The macro must replace all instances of old_char within string_literal with new_char.
  • The macro must return a string literal.
  • The macro should handle empty strings gracefully.
  • The macro should work correctly with any valid Rust string literal (including those with escape sequences).

Expected Behavior:

The macro should expand to a string literal containing the transformed string. The transformation should be performed character by character.

Edge Cases to Consider:

  • Empty input string.
  • old_char not present in the string.
  • old_char and new_char being the same character.
  • String literals containing escape sequences (e.g., \n, \t, \"). The macro should not modify escape sequences.

Examples

Example 1:

Input: transform_string!("hello world", 'l', 'x');
Output: "hexxo worxd"
Explanation: All occurrences of 'l' are replaced with 'x'.

Example 2:

Input: transform_string!("rust is fun", ' ', '_');
Output: "rust_is_fun"
Explanation: All spaces are replaced with underscores.

Example 3:

Input: transform_string!("", 'a', 'b');
Output: ""
Explanation: An empty string remains empty.

Example 4:

Input: transform_string!("hello", 'z', 'a');
Output: "hello"
Explanation: 'z' is not present, so the string remains unchanged.

Example 5:

Input: transform_string!("hello", 'l', 'l');
Output: "hello"
Explanation: Replacing 'l' with 'l' results in no change.

Example 6:

Input: transform_string!("\"hello\"", '"', '!');
Output: "\'hello\'"
Explanation: Escape sequences are preserved.

Constraints

  • The macro must be implemented using Rust's declarative macro system (macro_rules!).
  • The macro must be able to handle string literals of reasonable length (up to 1000 characters). While not strictly enforced, excessively long strings might impact performance.
  • The characters to be replaced and the replacement character must be single characters (char type).
  • The macro should not panic or produce invalid Rust code.

Notes

  • Think about how to iterate through the characters of the string literal within the macro.
  • Rust's macro system operates on tokens, not strings directly. You'll need to manipulate the tokens representing the string literal.
  • Consider using pattern matching to identify the characters you want to replace.
  • The stringify! macro can be helpful for converting expressions into string literals within the macro. However, it's not directly applicable here.
  • Focus on correctness and readability. While performance is a consideration, prioritize producing a working solution first.
  • Remember that macros are expanded at compile time.
Loading editor...
rust