Skip to content

[Refactor] Deduplicate pattern argument checking logic - #334

Closed
logbie wants to merge 4 commits into
mainfrom
refactor-pattern-helpers-6239104481551978944
Closed

[Refactor] Deduplicate pattern argument checking logic#334
logbie wants to merge 4 commits into
mainfrom
refactor-pattern-helpers-6239104481551978944

Conversation

@logbie

@logbie logbie commented Feb 9, 2026

Copy link
Copy Markdown
Collaborator

Refactored src/stdlib/pattern.rs to use src/stdlib/helpers.rs for argument checking and type extraction.
Added expect_pattern to src/stdlib/helpers.rs.
Updated native_pattern_replace and native_pattern_split signatures to standardized format.
Updated src/interpreter/mod.rs to handle new signatures and error mapping.
Updated tests in src/stdlib/pattern_test.rs to match new error messages.
Verified with cargo test, cargo clippy, and cargo fmt.


PR created automatically by Jules for task 6239104481551978944 started by @logbie

Summary by CodeRabbit

  • Bug Fixes

    • Pattern operations now attach precise source-location info to reported errors.
  • New Features

    • Pattern matching returns enriched results including matched text, start/end positions, and captured groups.
    • Pattern split correctly handles consecutive matches and edge cases, returning expected empty segments when appropriate.

Co-authored-by: logbie <1138960+logbie@users.noreply.github.com>
@google-labs-jules

Copy link
Copy Markdown
Contributor

👋 Jules, reporting for duty! I'm here to lend a hand with this pull request.

When you start a review, I'll add a 👀 emoji to each comment to let you know I've read it. I'll focus on feedback directed at me and will do my best to stay out of conversations between you and other bots or reviewers to keep the noise down.

I'll push a commit with your requested changes shortly after. Please note there might be a delay between these steps, but rest assured I'm on the job!

For more direct control, you can switch me to Reactive Mode. When this mode is on, I will only act on comments where you specifically mention me with @jules. You can find this option in the Pull Request section of your global Jules UI settings. You can always switch back!

New to Jules? Learn more at jules.google/docs.


For security, I will only act on instructions from the user who triggered this task.

Copilot AI review requested due to automatic review settings February 9, 2026 09:59
@claude

claude Bot commented Feb 9, 2026

Copy link
Copy Markdown
Contributor

Claude finished @logbie's task —— View job


Code Review Complete ✅

This is a well-executed refactoring that successfully deduplicates argument checking logic. Here's my comprehensive review:

Strengths

Code Quality & Best Practices:

  • Excellent deduplication: Reduces pattern.rs from ~300 to ~200 lines by leveraging shared helpers
  • Consistent error handling: All functions now use standardized check_arg_count() and expect_*() helpers
  • Clear separation of concerns: Helper functions are well-documented and focused on single responsibilities
  • Good function naming: expect_pattern follows the established naming convention

Type Safety & Error Handling:

  • Robust type checking: expect_pattern properly validates pattern types with clear error messages
  • Consistent error propagation: Interpreter correctly maps errors with line/column info using map_err()
  • Proper resource management: Maintains Rc<CompiledPattern> pattern for efficient memory sharing

⚠️ Areas for Improvement

Incomplete Implementation:

  • Critical: native_pattern_replace has a TODO and returns input text unchanged (line 129 in pattern.rs:129)
    • This could cause silent failures where replacements don't work
    • Should either be implemented or clearly documented as not yet functional

Documentation Gap:

  • Missing examples section in expect_pattern docstring compared to other helper functions
  • Consider adding usage example for consistency

🔍 Technical Analysis

Performance Considerations:

  • Memory efficiency: Uses Rc::clone() for patterns, avoiding unnecessary copies
  • Error allocation: Helper functions minimize redundant error string creation
  • Zero overhead: Refactoring doesn't introduce performance regressions

Security Considerations:

  • Input validation: All user inputs properly validated before processing
  • Type safety: Strong typing prevents injection through type confusion
  • Error information: Errors don't leak sensitive implementation details

Test Coverage:

  • Updated appropriately: Tests correctly updated for new error message format ("Expected text" vs previous format)
  • Backward compatibility: Error handling maintains same user experience
  • ⚠️ Missing coverage: No specific tests for the new expect_pattern helper function

📋 Recommendations

  1. High Priority: Address the TODO in native_pattern_replace - either implement it or document the limitation
  2. Medium Priority: Add usage example to expect_pattern docstring for consistency
  3. Low Priority: Consider adding a unit test specifically for expect_pattern error cases

📊 Impact Assessment

  • Code maintainability: ⬆️ Significantly improved through deduplication
  • Type safety: ➡️ Maintained at same high level
  • Performance: ➡️ No impact (potentially slight improvement from reduced code size)
  • Backward compatibility: ✅ Fully maintained
  • Test coverage: ➡️ Adequate, though could be enhanced

This refactoring successfully achieves its goals of reducing code duplication while maintaining all existing functionality. The pattern replacement TODO is the only significant concern that should be addressed.

@coderabbitai

coderabbitai Bot commented Feb 9, 2026

Copy link
Copy Markdown
Contributor
📝 Walkthrough

Walkthrough

Centralized argument validation for pattern stdlib functions; added expect_pattern; removed line/column from some native signatures; interpreter now wraps stdlib pattern errors with RuntimeError that includes source location.

Changes

Cohort / File(s) Summary
Interpreter callsites
src/interpreter/mod.rs
Wraps errors returned from stdlib pattern helpers with .map_err(...) into RuntimeError::with_kind(line, column, ...) so source location is attached at callsite rather than passed into helpers.
Stdlib helpers
src/stdlib/helpers.rs
Adds pub fn expect_pattern(...) -> Result<Rc<crate::pattern::CompiledPattern>, RuntimeError> (note: duplicate insertion appears twice in this diff).
Pattern stdlib implementation
src/stdlib/pattern.rs
Introduces check_arg_count, uses expect_text/expect_pattern; changes native_pattern_replace and native_pattern_split signatures to accept only args: Vec<Value>; refactors matching, replace, and split logic to operate on compiled patterns and return richer match objects/lists; character->byte index handling added.
Tests
src/stdlib/pattern_test.rs
Updated expected error messages to reflect new helper wording (e.g., "expects 2 arguments", "Expected text").

Sequence Diagram(s)

sequenceDiagram
    participant Interpreter as Interpreter
    participant Stdlib as Stdlib::pattern
    participant Engine as PatternEngine
    participant Runtime as RuntimeError

    Interpreter->>Stdlib: call native_pattern_replace(args)
    Stdlib->>Stdlib: check_arg_count / expect_text / expect_pattern
    Stdlib->>Engine: compiled_pattern.matches/find/replace(...)
    alt match succeeds
        Engine-->>Stdlib: match results
        Stdlib-->>Interpreter: Ok(Value)
    else engine error
        Engine-->>Stdlib: Err(lib_error)
        Stdlib-->>Interpreter: Err(lib_error)  %% returns error without line/col
        Interpreter->>Runtime: map_err -> RuntimeError::with_kind(line,column, ...)
        Runtime-->>Interpreter: RuntimeError (propagated)
    end
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

Poem

🐇 I hopped through patterns, stitched each seam,
Found helpers neat as a carrot dream,
Errors now point where the bug did start,
Splits and replaces play their part,
Hop, patch, and code — a rabbit's art! 🥕

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title directly reflects the main objective of this PR: refactoring pattern argument checking logic by deduplicating it into helpers.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch refactor-pattern-helpers-6239104481551978944

No actionable comments were generated in the recent review. 🎉

🧹 Recent nitpick comments
src/stdlib/pattern.rs (2)

91-116: Consider extracting shared match-result-to-Value conversion.

pattern_find_native (lines 50–74) and pattern_find_all_native (lines 91–115) contain nearly identical logic to convert a MatchResult into a Value::Object HashMap. A small helper (e.g., match_result_to_value(m: MatchResult) -> Value) would reduce duplication and keep both call sites in sync.


139-144: Nit: redundant let mut rebinding.

Line 143 shadows the binding from line 139 just to add mutability. Declare it mutable from the start.

Proposed fix
-    let char_to_byte: Vec<usize> = text_str
+    let mut char_to_byte: Vec<usize> = text_str
         .char_indices()
         .map(|(byte_idx, _)| byte_idx)
         .collect();
-    let mut char_to_byte = char_to_byte;
     char_to_byte.push(text_str.len()); // Add final byte position

Same pattern appears at lines 205–207 in native_pattern_split.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Refactors stdlib pattern functions to reuse shared argument-count/type-extraction helpers, and updates interpreter wiring + tests to match standardized errors.

Changes:

  • Replaced per-function argument checking in pattern.rs with check_arg_count, expect_text, and new expect_pattern.
  • Standardized native_pattern_replace / native_pattern_split to take only args, with interpreter-side error remapping to attach source locations.
  • Updated pattern stdlib tests to match the new helper-driven error messages.

Reviewed changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated 2 comments.

File Description
src/stdlib/pattern.rs Deduplicates arg validation/type extraction via helpers; standardizes replace/split signatures.
src/stdlib/helpers.rs Adds expect_pattern helper for extracting compiled patterns from Value.
src/interpreter/mod.rs Adapts interpreter to new native signatures and remaps errors to include line/column.
src/stdlib/pattern_test.rs Updates assertions to match new standardized error phrasing.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread src/stdlib/helpers.rs
match value {
Value::Pattern(p) => Ok(Rc::clone(p)),
_ => Err(RuntimeError::new(
format!("Expected a pattern, got {}", value.type_name()),

Copilot AI Feb 9, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

expect_text uses the phrasing "Expected text, got ...", while expect_pattern uses "Expected a pattern, got ...". For consistency (and easier test/assert matching across helpers), consider standardizing the phrasing, e.g. "Expected pattern, got ..." (or update the other helpers to include the article).

Suggested change
format!("Expected a pattern, got {}", value.type_name()),
format!("Expected pattern, got {}", value.type_name()),

Copilot uses AI. Check for mistakes.
Comment thread src/stdlib/helpers.rs
Comment on lines +438 to +455
/// Extracts a CompiledPattern value from a WFL Value, returning it as a reference-counted CompiledPattern.
///
/// Returns an `Rc<CompiledPattern>` clone (incrementing the reference count) if the value
/// is a Pattern variant.
///
/// # Arguments
///
/// * `value` - The WFL Value to extract from
///
/// # Returns
///
/// Returns an `Rc<CompiledPattern>` clone (incrementing the reference count) if the value
/// is a Pattern variant.
///
/// # Errors
///
/// Returns `RuntimeError` if the value is not a Pattern, with an error message
/// indicating the expected type and the actual type received.

Copilot AI Feb 9, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The doc comment repeats the same “Returns an Rc<CompiledPattern> clone …” text in both the summary section and # Returns. Consider deduplicating to keep the docs concise (e.g., mention the Rc::clone behavior once, in # Returns).

Copilot uses AI. Check for mistakes.
@logbie

logbie commented Feb 9, 2026

Copy link
Copy Markdown
Collaborator Author

Incomplete Implementation:

Critical: native_pattern_replace has a TODO and returns input text unchanged (line 129 in pattern.rs:129)
This could cause silent failures where replacements don't work
Should either be implemented or clearly documented as not yet functional
Documentation Gap:

Missing examples section in expect_pattern docstring compared to other helper functions
Consider adding usage example for consistency

@google-labs-jules

Copy link
Copy Markdown
Contributor

Incomplete Implementation:

Critical: native_pattern_replace has a TODO and returns input text unchanged (line 129 in pattern.rs:129)
This could cause silent failures where replacements don't work
Should either be implemented or clearly documented as not yet functional
Documentation Gap:

Missing examples section in expect_pattern docstring compared to other helper functions
Consider adding usage example for consistency

I have implemented the replacement logic in native_pattern_replace using find_all to perform substitutions. I also added a usage example to the expect_pattern documentation as requested.

Co-authored-by: logbie <1138960+logbie@users.noreply.github.com>
@claude

claude Bot commented Feb 9, 2026

Copy link
Copy Markdown
Contributor

Claude finished @logbie's task —— View job


Code Review for Pattern Refactoring PR

Completed comprehensive review of the pattern argument checking logic refactoring...

Todo List:

  • Read and analyze changed files
  • Evaluate code quality and best practices
  • Check for potential bugs or issues
  • Assess performance considerations
  • Review security concerns
  • Evaluate test coverage
  • Provide final recommendations

🔍 Code Review Summary

This is a well-executed refactoring that successfully deduplicates argument checking logic across pattern functions. The changes demonstrate good engineering practices and maintain backward compatibility.

Strengths

Code Quality & Best Practices:

  • Excellent deduplication: Reduces pattern.rs from ~300 to ~200 lines by leveraging shared helpers in src/stdlib/helpers.rs:437-476
  • Consistent error handling: All functions now use standardized check_arg_count() and expect_*() helpers
  • Clear separation of concerns: Helper functions are well-documented and focused on single responsibilities
  • Proper function signatures: Successfully standardized native_pattern_replace and native_pattern_split to take only args parameter

Type Safety & Error Handling:

  • Robust type checking: expect_pattern properly validates pattern types with clear error messages in src/stdlib/helpers.rs:467-476
  • Consistent error propagation: Interpreter correctly maps errors with line/column info using map_err() in src/interpreter/mod.rs:6662-6663 and src/interpreter/mod.rs:6676-6677
  • Proper resource management: Maintains Rc<CompiledPattern> pattern for efficient memory sharing

Implementation Quality:

  • Complete implementation: Jules addressed the previous TODO in native_pattern_replace - now fully functional in src/stdlib/pattern.rs:122-152
  • Correct Unicode handling: Pattern split function properly handles character-to-byte index mapping in src/stdlib/pattern.rs:171-173
  • Edge case handling: Handles empty matches and consecutive matches correctly

⚠️ Areas for Improvement

Minor Consistency Issues:

  • Error message consistency: expect_pattern uses "Expected a pattern, got..." while expect_text uses "Expected text, got..." (noted by Copilot reviewer in src/stdlib/helpers.rs:471)
    • Consider standardizing to either include or exclude the article "a"
  • Documentation consistency: expect_pattern docstring repeats information between summary and Returns sections (noted by Copilot reviewer in src/stdlib/helpers.rs:455)

📊 Technical Analysis

Performance Considerations:

  • Memory efficiency: Uses Rc::clone() for patterns, avoiding unnecessary copies
  • Error allocation: Helper functions minimize redundant error string creation
  • Zero overhead: Refactoring doesn't introduce performance regressions
  • String handling: Efficient replacement algorithm with pre-allocated capacity in src/stdlib/pattern.rs:137

Security Considerations:

  • Input validation: All user inputs properly validated before processing
  • Type safety: Strong typing prevents injection through type confusion
  • Error information: Errors don't leak sensitive implementation details
  • Memory safety: Proper Rust memory management with Rc/Arc

Test Coverage:

  • Updated appropriately: Tests correctly updated for new error message format in src/stdlib/pattern_test.rs:24,36,48,61
  • Backward compatibility: Error handling maintains same user experience
  • Integration coverage: Full functionality tested through WFL integration tests (noted in src/stdlib/pattern_test.rs:4)

Code Architecture:

  • Proper layering: Clean separation between interpreter and stdlib
  • Error mapping: Interpreter correctly adds source location context without passing line/column to stdlib functions
  • Function registration: Proper registration of pattern functions in environment

🎯 Recommendations

  1. Low Priority: Consider standardizing error message format across helpers for consistency
  2. Low Priority: Clean up docstring duplication in expect_pattern
  3. Enhancement: The current implementation is production-ready as-is

📋 Impact Assessment

Aspect Impact Notes
Code maintainability ⬆️ Significantly improved Reduced duplication, shared validation logic
Type safety ➡️ Maintained Strong typing preserved with helper functions
Performance ➡️ No impact Potentially slight improvement from reduced code size
Backward compatibility Fully maintained All existing functionality preserved
Test coverage ➡️ Adequate Good coverage with integration tests
Security Maintained Proper input validation and error handling

Conclusion

This refactoring successfully achieves its primary goals:

  • ✅ Eliminates code duplication
  • ✅ Standardizes argument validation
  • ✅ Improves maintainability
  • ✅ Preserves all functionality
  • ✅ Maintains performance characteristics

The code is well-structured, follows Rust best practices, and demonstrates thoughtful engineering. The minor consistency issues noted are cosmetic and don't affect functionality.

Overall Assessment: ⭐⭐⭐⭐⭐ Excellent refactoring - Ready to merge


@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In `@src/stdlib/pattern.rs`:
- Around line 129-151: native_pattern_replace uses MatchResult.start/ end
(character indices) directly for &str slicing which can panic on multi-byte
UTF-8; mirror native_pattern_split by building the same char_to_byte mapping
from text_str.chars().enumerate().map(|(i, c)| (i, offset)) and convert match
indices via char_to_byte[m.start] and char_to_byte[m.end] (or compute byte
offsets for last_end too) before slicing; update variables in the loop and the
final slice to use byte offsets and return Arc::from(result) as before.
🧹 Nitpick comments (2)
src/stdlib/pattern.rs (2)

170-173: Nit: redundant variable rebinding.

Line 171 creates an immutable char_to_byte, then line 172 re-binds it as mutable solely to call .push() on line 173. Simplify by declaring it mut from the start.

♻️ Suggested simplification
-    let char_to_byte: Vec<usize> = text.char_indices().map(|(byte_idx, _)| byte_idx).collect();
-    let mut char_to_byte = char_to_byte;
-    char_to_byte.push(text.len()); // Add final byte position
+    let mut char_to_byte: Vec<usize> = text.char_indices().map(|(byte_idx, _)| byte_idx).collect();
+    char_to_byte.push(text.len()); // Add final byte position

41-119: Extract shared MatchResult → Value conversion to reduce duplication.

pattern_find_native (lines 50–74) and pattern_find_all_native (lines 91–115) contain nearly identical logic for converting a match result into a Value::Object with matched_text, start, end, and optional captures. Given this PR's goal is to deduplicate pattern logic, extracting a small helper (e.g., fn match_result_to_value(m: MatchResult) -> Value) would further that objective.

♻️ Sketch of a shared helper
fn match_result_to_value(match_result: crate::pattern::MatchResult) -> Value {
    let mut result_map = HashMap::new();
    result_map.insert(
        "matched_text".to_string(),
        Value::Text(Arc::from(match_result.matched_text.as_str())),
    );
    result_map.insert("start".to_string(), Value::Number(match_result.start as f64));
    result_map.insert("end".to_string(), Value::Number(match_result.end as f64));

    if !match_result.captures.is_empty() {
        let captures_map: HashMap<String, Value> = match_result
            .captures
            .into_iter()
            .map(|(name, value)| (name, Value::Text(Arc::from(value.as_str()))))
            .collect();
        result_map.insert(
            "captures".to_string(),
            Value::Object(Rc::new(RefCell::new(captures_map))),
        );
    }

    Value::Object(Rc::new(RefCell::new(result_map)))
}

Then pattern_find_native and pattern_find_all_native would each just call match_result_to_value(m).

Comment thread src/stdlib/pattern.rs
@logbie

logbie commented Feb 9, 2026

Copy link
Copy Markdown
Collaborator Author

In @src/stdlib/pattern.rs around lines 129 - 151, native_pattern_replace uses
MatchResult.start/ end (character indices) directly for &str slicing which can
panic on multi-byte UTF-8; mirror native_pattern_split by building the same
char_to_byte mapping from text_str.chars().enumerate().map(|(i, c)| (i, offset))
and convert match indices via char_to_byte[m.start] and char_to_byte[m.end] (or
compute byte offsets for last_end too) before slicing; update variables in the
loop and the final slice to use byte offsets and return Arc::from(result) as
before.

@google-labs-jules

Copy link
Copy Markdown
Contributor

In @src/stdlib/pattern.rs around lines 129 - 151, native_pattern_replace uses
MatchResult.start/ end (character indices) directly for &str slicing which can
panic on multi-byte UTF-8; mirror native_pattern_split by building the same
char_to_byte mapping from text_str.chars().enumerate().map(|(i, c)| (i, offset))
and convert match indices via char_to_byte[m.start] and char_to_byte[m.end] (or
compute byte offsets for last_end too) before slicing; update variables in the
loop and the final slice to use byte offsets and return Arc::from(result) as
before.

Thank you for the detailed feedback. I have updated native_pattern_replace to use the same char_to_byte mapping logic as native_pattern_split. This ensures safe string slicing by converting character indices (from MatchResult) to valid byte offsets, preventing panics on multi-byte UTF-8 characters.

Co-authored-by: logbie <1138960+logbie@users.noreply.github.com>
Copilot AI review requested due to automatic review settings February 9, 2026 16:13
@claude

claude Bot commented Feb 9, 2026

Copy link
Copy Markdown
Contributor

Claude Code is working…

I'll analyze this and get back to you.

View job run

@claude

claude Bot commented Feb 9, 2026

Copy link
Copy Markdown
Contributor

Claude finished @logbie's task —— View job


Code Review for Pattern Refactoring PR

Completed comprehensive review of the pattern argument checking logic refactoring...

Todo List:

  • Read and analyze changed files
  • Evaluate code quality and best practices
  • Check for potential bugs or issues
  • Assess performance considerations
  • Review security concerns
  • Evaluate test coverage
  • Provide final recommendations

🔍 Code Review Summary

This is a well-executed refactoring that successfully deduplicates argument checking logic across pattern functions. The changes demonstrate good engineering practices and maintain backward compatibility.

Strengths

Code Quality & Best Practices:

  • Excellent deduplication: Reduces pattern.rs from ~300 to ~200 lines by leveraging shared helpers in src/stdlib/helpers.rs:437-476
  • Consistent error handling: All functions now use standardized check_arg_count() and expect_*() helpers
  • Clear separation of concerns: Helper functions are well-documented and focused on single responsibilities
  • Proper function signatures: Successfully standardized native_pattern_replace and native_pattern_split to take only args parameter

Type Safety & Error Handling:

  • Robust type checking: expect_pattern properly validates pattern types with clear error messages in src/stdlib/helpers.rs:467-476
  • Consistent error propagation: Interpreter correctly maps errors with line/column info using map_err() in src/interpreter/mod.rs:6662-6663 and src/interpreter/mod.rs:6676-6677
  • Proper resource management: Maintains Rc<CompiledPattern> pattern for efficient memory sharing

Implementation Quality:

  • Complete implementation: Jules addressed the previous TODO in native_pattern_replace - now fully functional in src/stdlib/pattern.rs:122-152
  • Correct Unicode handling: Pattern split function properly handles character-to-byte index mapping in src/stdlib/pattern.rs:171-173
  • Edge case handling: Handles empty matches and consecutive matches correctly

⚠️ Areas for Improvement

Minor Consistency Issues:

  • Error message consistency: expect_pattern uses "Expected a pattern, got..." while expect_text uses "Expected text, got..." (noted by Copilot reviewer in src/stdlib/helpers.rs:471)
    • Consider standardizing to either include or exclude the article "a"
  • Documentation consistency: expect_pattern docstring repeats information between summary and Returns sections (noted by Copilot reviewer in src/stdlib/helpers.rs:455)

📊 Technical Analysis

Performance Considerations:

  • Memory efficiency: Uses Rc::clone() for patterns, avoiding unnecessary copies
  • Error allocation: Helper functions minimize redundant error string creation
  • Zero overhead: Refactoring doesn't introduce performance regressions
  • String handling: Efficient replacement algorithm with pre-allocated capacity in src/stdlib/pattern.rs:137

Security Considerations:

  • Input validation: All user inputs properly validated before processing
  • Type safety: Strong typing prevents injection through type confusion
  • Error information: Errors don't leak sensitive implementation details
  • Memory safety: Proper Rust memory management with Rc/Arc

Test Coverage:

  • Updated appropriately: Tests correctly updated for new error message format in src/stdlib/pattern_test.rs:24,36,48,61
  • Backward compatibility: Error handling maintains same user experience
  • Integration coverage: Full functionality tested through WFL integration tests (noted in src/stdlib/pattern_test.rs:4)

Code Architecture:

  • Proper layering: Clean separation between interpreter and stdlib
  • Error mapping: Interpreter correctly adds source location context without passing line/column to stdlib functions
  • Function registration: Proper registration of pattern functions in environment

🎯 Recommendations

  1. Low Priority: Consider standardizing error message format across helpers for consistency
  2. Low Priority: Clean up docstring duplication in expect_pattern
  3. Enhancement: The current implementation is production-ready as-is

📋 Impact Assessment

Aspect Impact Notes
Code maintainability ⬆️ Significantly improved Reduced duplication, shared validation logic
Type safety ➡️ Maintained Strong typing preserved with helper functions
Performance ➡️ No impact Potentially slight improvement from reduced code size
Backward compatibility Fully maintained All existing functionality preserved
Test coverage ➡️ Adequate Good coverage with integration tests
Security Maintained Proper input validation and error handling

Conclusion

This refactoring successfully achieves its primary goals:

  • ✅ Eliminates code duplication
  • ✅ Standardizes argument validation
  • ✅ Improves maintainability
  • ✅ Preserves all functionality
  • ✅ Maintains performance characteristics

The code is well-structured, follows Rust best practices, and demonstrates thoughtful engineering. The minor consistency issues noted are cosmetic and don't affect functionality.

Overall Assessment: ⭐⭐⭐⭐⭐ Excellent refactoring - Ready to merge


@coderabbitai

coderabbitai Bot commented Feb 9, 2026

Copy link
Copy Markdown
Contributor

Caution

Failed to replace (edit) comment. This is likely due to insufficient permissions or the comment being deleted.

Error details
{"name":"HttpError","status":500,"request":{"method":"PATCH","url":"https://api.github.com/repos/WebFirstLanguage/wfl/issues/comments/3870683508","headers":{"accept":"application/vnd.github.v3+json","user-agent":"octokit.js/0.0.0-development octokit-core.js/7.0.6 Node.js/24","authorization":"token [REDACTED]","content-type":"application/json; charset=utf-8"},"body":{"body":"<!-- This is an auto-generated comment: summarize by coderabbit.ai -->\n<!-- This is an auto-generated comment: review in progress by coderabbit.ai -->\n\n> [!NOTE]\n> Currently processing new changes in this PR. This may take a few minutes, please wait...\n> \n> \n> \n> ```ascii\n>  __________________________________________\n> < Fight fire with fire. Review AI with AI. >\n>  ------------------------------------------\n>   \\\n>    \\   (\\__/)\n>        (•ㅅ•)\n>        /   づ\n> ```\n> \n> <sub>✏️ Tip: You can disable in-progress messages and the fortune message in your review settings.</sub>\n\n<!-- end of auto-generated comment: review in progress by coderabbit.ai -->\n<!-- usage_tips_start -->\n\n> [!TIP]\n> <details>\n> <summary>CodeRabbit can use Trivy to scan for security misconfigurations and secrets in Infrastructure as Code files.</summary>\n> \n> Add a [.trivyignore file](https://aquasecurity.github.io/trivy/latest/docs/configuration/filtering/) to your project to customize which findings Trivy reports.\n> \n> </details>\n\n<!-- usage_tips_end -->\n<!-- walkthrough_start -->\n\n<details>\n<summary>📝 Walkthrough</summary>\n\n## Walkthrough\n\nReworked stdlib pattern handling: added `expect_pattern` helper, migrated pattern functions to `check_arg_count`/`expect_*` validation, removed `line`/`column` params from some natives, and adjusted interpreter call sites to wrap stdlib errors into `RuntimeError` with source-location context.\n\n## Changes\n\n|Cohort / File(s)|Summary|\n|---|---|\n|**Interpreter callsites** <br> `src/interpreter/mod.rs`|Wraps stdlib pattern helper errors with `.map_err(...)` into `RuntimeError::with_kind` using current line/column instead of passing location into helpers.|\n|**Stdlib helpers** <br> `src/stdlib/helpers.rs`|Adds `pub fn expect_pattern(...) -> Result<Rc<...>, RuntimeError>` (note: added twice in file in this diff).|\n|**Pattern stdlib implementation** <br> `src/stdlib/pattern.rs`|Replaces manual arg-count/type checks with `check_arg_count` + `expect_text`/`expect_pattern`; updates `pattern_matches`, `pattern_find`, `pattern_find_all`, `native_pattern_replace`, `native_pattern_split` logic and signatures (removes `line`,`column`), enriches match result objects, and implements full split behavior.|\n|**Tests** <br> `src/stdlib/pattern_test.rs`|Updated expected error strings to match new helper messages (e.g., \"expects 2 arguments\", \"Expected text\").|\n\n## Estimated code review effort\n\n🎯 4 (Complex) | ⏱️ ~45 minutes\n\n## Possibly related PRs\n\n- WebFirstLanguage/wfl#311: Refactors stdlib argument validation and introduces shared helpers used alongside this change.  \n- WebFirstLanguage/wfl#310: Earlier migration to `expect_*` helpers and related stdlib validation updates.  \n- WebFirstLanguage/wfl#314: Adds/extends helper-based validation (e.g., `expect_pattern`) and continues refactoring pattern-related stdlib functions.\n\n## Poem\n\n> 🐇 I nibbled through patterns, neat and small,  \n> Found helpers to catch when types may fall,  \n> Errors now point to the exact little spot,  \n> Splits and replaces behave as they ought,  \n> Hop, debug, repeat — code gardens grow tall! 🌱\n\n</details>\n\n<!-- walkthrough_end -->\n\n<!-- pre_merge_checks_walkthrough_start -->\n\n<details>\n<summary>🚥 Pre-merge checks | ✅ 3</summary>\n\n<details>\n<summary>✅ Passed checks (3 passed)</summary>\n\n|     Check name     | Status   | Explanation                                                                                                                                                             |\n| :----------------: | :------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n|  Description Check | ✅ Passed | Check skipped - CodeRabbit’s high-level summary is enabled.                                                                                                             |\n|     Title check    | ✅ Passed | The title clearly describes the main objective: deduplicating pattern argument checking logic across the codebase by refactoring pattern.rs to use centralized helpers. |\n| Docstring Coverage | ✅ Passed | Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.                                                                                    |\n\n</details>\n\n<sub>✏️ Tip: You can configure your own custom pre-merge checks in the settings.</sub>\n\n</details>\n\n<!-- pre_merge_checks_walkthrough_end -->\n\n<!-- finishing_touch_checkbox_start -->\n\n<details>\n<summary>✨ Finishing touches</summary>\n\n- [ ] <!-- {\"checkboxId\": \"7962f53c-55bc-4827-bfbf-6a18da830691\"} --> 📝 Generate docstrings\n<details>\n<summary>🧪 Generate unit tests (beta)</summary>\n\n- [ ] <!-- {\"checkboxId\": \"f47ac10b-58cc-4372-a567-0e02b2c3d479\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} -->   Create PR with unit tests\n- [ ] <!-- {\"checkboxId\": \"07f1e7d6-8a8e-4e23-9900-8731c2c87f58\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} -->   Post copyable unit tests in a comment\n- [ ] <!-- {\"checkboxId\": \"6ba7b810-9dad-11d1-80b4-00c04fd430c8\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} -->   Commit unit tests in branch `refactor-pattern-helpers-6239104481551978944`\n\n</details>\n\n</details>\n\n<!-- finishing_touch_checkbox_end -->\n\n<!-- tips_start -->\n\n---\n\nThanks for using [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=WebFirstLanguage/wfl&utm_content=334)! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.\n\n<details>\n<summary>❤️ Share</summary>\n\n- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai)\n- [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai)\n- [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai)\n- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)\n\n</details>\n\n<sub>Comment `@coderabbitai help` to get the list of available commands and usage tips.</sub>\n\n<!-- tips_end -->\n\n<!-- internal state start -->\n\n\n<!-- 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 -->\n\n<!-- internal state end -->"},"request":{"retryCount":3,"retries":3,"retryAfter":16}},"response":{"url":"https://api.github.com/repos/WebFirstLanguage/wfl/issues/comments/3870683508","status":500,"headers":{"access-control-allow-origin":"*","access-control-expose-headers":"ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset","content-length":"0","content-security-policy":"default-src 'none'","content-type":"application/json; charset=utf-8","date":"Mon, 09 Feb 2026 16:14:21 GMT","referrer-policy":"origin-when-cross-origin, strict-origin-when-cross-origin","server":"github.com","strict-transport-security":"max-age=31536000; includeSubdomains; preload","vary":"Accept-Encoding, Accept, X-Requested-With","x-accepted-github-permissions":"issues=write; pull_requests=write","x-content-type-options":"nosniff","x-frame-options":"deny","x-github-api-version-selected":"2022-11-28","x-github-media-type":"github.v3; format=json","x-github-request-id":"6885:8BA36:12EA0F:5148E2:698A07DB","x-ratelimit-limit":"5000","x-ratelimit-remaining":"4975","x-ratelimit-reset":"1770657208","x-ratelimit-resource":"core","x-ratelimit-used":"25","x-xss-protection":"0"},"data":""}}

1 similar comment
@coderabbitai

coderabbitai Bot commented Feb 9, 2026

Copy link
Copy Markdown
Contributor

Caution

Failed to replace (edit) comment. This is likely due to insufficient permissions or the comment being deleted.

Error details
{"name":"HttpError","status":500,"request":{"method":"PATCH","url":"https://api.github.com/repos/WebFirstLanguage/wfl/issues/comments/3870683508","headers":{"accept":"application/vnd.github.v3+json","user-agent":"octokit.js/0.0.0-development octokit-core.js/7.0.6 Node.js/24","authorization":"token [REDACTED]","content-type":"application/json; charset=utf-8"},"body":{"body":"<!-- This is an auto-generated comment: summarize by coderabbit.ai -->\n<!-- This is an auto-generated comment: review in progress by coderabbit.ai -->\n\n> [!NOTE]\n> Currently processing new changes in this PR. This may take a few minutes, please wait...\n> \n> \n> \n> ```ascii\n>  __________________________________________\n> < Fight fire with fire. Review AI with AI. >\n>  ------------------------------------------\n>   \\\n>    \\   (\\__/)\n>        (•ㅅ•)\n>        /   づ\n> ```\n> \n> <sub>✏️ Tip: You can disable in-progress messages and the fortune message in your review settings.</sub>\n\n<!-- end of auto-generated comment: review in progress by coderabbit.ai -->\n<!-- usage_tips_start -->\n\n> [!TIP]\n> <details>\n> <summary>CodeRabbit can use Trivy to scan for security misconfigurations and secrets in Infrastructure as Code files.</summary>\n> \n> Add a [.trivyignore file](https://aquasecurity.github.io/trivy/latest/docs/configuration/filtering/) to your project to customize which findings Trivy reports.\n> \n> </details>\n\n<!-- usage_tips_end -->\n<!-- walkthrough_start -->\n\n<details>\n<summary>📝 Walkthrough</summary>\n\n## Walkthrough\n\nReworked stdlib pattern handling: added `expect_pattern` helper, migrated pattern functions to `check_arg_count`/`expect_*` validation, removed `line`/`column` params from some natives, and adjusted interpreter call sites to wrap stdlib errors into `RuntimeError` with source-location context.\n\n## Changes\n\n|Cohort / File(s)|Summary|\n|---|---|\n|**Interpreter callsites** <br> `src/interpreter/mod.rs`|Wraps stdlib pattern helper errors with `.map_err(...)` into `RuntimeError::with_kind` using current line/column instead of passing location into helpers.|\n|**Stdlib helpers** <br> `src/stdlib/helpers.rs`|Adds `pub fn expect_pattern(...) -> Result<Rc<...>, RuntimeError>` (note: added twice in file in this diff).|\n|**Pattern stdlib implementation** <br> `src/stdlib/pattern.rs`|Replaces manual arg-count/type checks with `check_arg_count` + `expect_text`/`expect_pattern`; updates `pattern_matches`, `pattern_find`, `pattern_find_all`, `native_pattern_replace`, `native_pattern_split` logic and signatures (removes `line`,`column`), enriches match result objects, and implements full split behavior.|\n|**Tests** <br> `src/stdlib/pattern_test.rs`|Updated expected error strings to match new helper messages (e.g., \"expects 2 arguments\", \"Expected text\").|\n\n## Estimated code review effort\n\n🎯 4 (Complex) | ⏱️ ~45 minutes\n\n## Possibly related PRs\n\n- WebFirstLanguage/wfl#311: Refactors stdlib argument validation and introduces shared helpers used alongside this change.  \n- WebFirstLanguage/wfl#310: Earlier migration to `expect_*` helpers and related stdlib validation updates.  \n- WebFirstLanguage/wfl#314: Adds/extends helper-based validation (e.g., `expect_pattern`) and continues refactoring pattern-related stdlib functions.\n\n## Poem\n\n> 🐇 I nibbled through patterns, neat and small,  \n> Found helpers to catch when types may fall,  \n> Errors now point to the exact little spot,  \n> Splits and replaces behave as they ought,  \n> Hop, debug, repeat — code gardens grow tall! 🌱\n\n</details>\n\n<!-- walkthrough_end -->\n\n<!-- pre_merge_checks_walkthrough_start -->\n\n<details>\n<summary>🚥 Pre-merge checks | ✅ 3</summary>\n\n<details>\n<summary>✅ Passed checks (3 passed)</summary>\n\n|     Check name     | Status   | Explanation                                                                                                                                                             |\n| :----------------: | :------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n|  Description Check | ✅ Passed | Check skipped - CodeRabbit’s high-level summary is enabled.                                                                                                             |\n|     Title check    | ✅ Passed | The title clearly describes the main objective: deduplicating pattern argument checking logic across the codebase by refactoring pattern.rs to use centralized helpers. |\n| Docstring Coverage | ✅ Passed | Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.                                                                                    |\n\n</details>\n\n<sub>✏️ Tip: You can configure your own custom pre-merge checks in the settings.</sub>\n\n</details>\n\n<!-- pre_merge_checks_walkthrough_end -->\n\n<!-- finishing_touch_checkbox_start -->\n\n<details>\n<summary>✨ Finishing touches</summary>\n\n- [ ] <!-- {\"checkboxId\": \"7962f53c-55bc-4827-bfbf-6a18da830691\"} --> 📝 Generate docstrings\n<details>\n<summary>🧪 Generate unit tests (beta)</summary>\n\n- [ ] <!-- {\"checkboxId\": \"f47ac10b-58cc-4372-a567-0e02b2c3d479\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} -->   Create PR with unit tests\n- [ ] <!-- {\"checkboxId\": \"07f1e7d6-8a8e-4e23-9900-8731c2c87f58\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} -->   Post copyable unit tests in a comment\n- [ ] <!-- {\"checkboxId\": \"6ba7b810-9dad-11d1-80b4-00c04fd430c8\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} -->   Commit unit tests in branch `refactor-pattern-helpers-6239104481551978944`\n\n</details>\n\n</details>\n\n<!-- finishing_touch_checkbox_end -->\n\n<!-- tips_start -->\n\n---\n\nThanks for using [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=WebFirstLanguage/wfl&utm_content=334)! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.\n\n<details>\n<summary>❤️ Share</summary>\n\n- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai)\n- [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai)\n- [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai)\n- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)\n\n</details>\n\n<sub>Comment `@coderabbitai help` to get the list of available commands and usage tips.</sub>\n\n<!-- tips_end -->\n\n<!-- internal state start -->\n\n\n<!-- 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 -->\n\n<!-- internal state end -->"},"request":{"retryCount":3,"retries":3,"retryAfter":16}},"response":{"url":"https://api.github.com/repos/WebFirstLanguage/wfl/issues/comments/3870683508","status":500,"headers":{"access-control-allow-origin":"*","access-control-expose-headers":"ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset","content-length":"0","content-security-policy":"default-src 'none'","content-type":"application/json; charset=utf-8","date":"Mon, 09 Feb 2026 16:14:21 GMT","referrer-policy":"origin-when-cross-origin, strict-origin-when-cross-origin","server":"github.com","strict-transport-security":"max-age=31536000; includeSubdomains; preload","vary":"Accept-Encoding, Accept, X-Requested-With","x-accepted-github-permissions":"issues=write; pull_requests=write","x-content-type-options":"nosniff","x-frame-options":"deny","x-github-api-version-selected":"2022-11-28","x-github-media-type":"github.v3; format=json","x-github-request-id":"6885:8BA36:12EA0F:5148E2:698A07DB","x-ratelimit-limit":"5000","x-ratelimit-remaining":"4975","x-ratelimit-reset":"1770657208","x-ratelimit-resource":"core","x-ratelimit-used":"25","x-xss-protection":"0"},"data":""}}

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 4 out of 4 changed files in this pull request and generated 3 comments.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread src/stdlib/helpers.rs
Comment on lines +467 to +476
pub fn expect_pattern(value: &Value) -> Result<Rc<crate::pattern::CompiledPattern>, RuntimeError> {
match value {
Value::Pattern(p) => Ok(Rc::clone(p)),
_ => Err(RuntimeError::new(
format!("Expected a pattern, got {}", value.type_name()),
0,
0,
)),
}
}

Copilot AI Feb 9, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The new error message uses a different phrasing than other expect_* helpers (e.g., expect_text is "Expected text, got ..."). For consistency (and to simplify tests that match on message fragments), consider changing this to "Expected pattern, got {}" to align with the existing helper style.

Copilot uses AI. Check for mistakes.
Comment thread src/stdlib/pattern.rs
Comment on lines +139 to +143
let char_to_byte: Vec<usize> = text_str
.char_indices()
.map(|(byte_idx, _)| byte_idx)
.collect();
let mut char_to_byte = char_to_byte;

Copilot AI Feb 9, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This introduces an unnecessary shadowing assignment (let mut char_to_byte = char_to_byte;). Prefer declaring it mutable in the initial binding to reduce churn and make the intent clearer.

Suggested change
let char_to_byte: Vec<usize> = text_str
.char_indices()
.map(|(byte_idx, _)| byte_idx)
.collect();
let mut char_to_byte = char_to_byte;
let mut char_to_byte: Vec<usize> = text_str
.char_indices()
.map(|(byte_idx, _)| byte_idx)
.collect();

Copilot uses AI. Check for mistakes.
Comment thread src/stdlib/pattern.rs
Comment on lines +122 to 135
pub fn native_pattern_replace(args: Vec<Value>) -> Result<Value, RuntimeError> {
check_arg_count("pattern_replace", &args, 3)?;

let text = expect_text(&args[0])?;
let pattern = expect_pattern(&args[1])?;
let replacement = expect_text(&args[2])?;

let text_str = text.as_ref();
let matches = pattern.find_all(text_str);

// If no matches, return original text
if matches.is_empty() {
return Ok(Value::Text(text));
}

Copilot AI Feb 9, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This PR changes native_pattern_replace from the prior placeholder behavior (it previously returned the original text) to a real replacement implementation. I don’t see any new/updated tests in this diff that exercise replacement correctness (basic replacement, multiple matches, leading/trailing matches, and Unicode text where char/byte indices differ). Adding targeted tests would help prevent regressions in the new indexing/slicing logic.

Copilot uses AI. Check for mistakes.
@coderabbitai

coderabbitai Bot commented Feb 9, 2026

Copy link
Copy Markdown
Contributor

Caution

Failed to replace (edit) comment. This is likely due to insufficient permissions or the comment being deleted.

Error details
{"name":"HttpError","status":500,"request":{"method":"PATCH","url":"https://api.github.com/repos/WebFirstLanguage/wfl/issues/comments/3870683508","headers":{"accept":"application/vnd.github.v3+json","user-agent":"octokit.js/0.0.0-development octokit-core.js/7.0.6 Node.js/24","authorization":"token [REDACTED]","content-type":"application/json; charset=utf-8"},"body":{"body":"<!-- This is an auto-generated comment: summarize by coderabbit.ai -->\n<!-- This is an auto-generated comment: review in progress by coderabbit.ai -->\n\n> [!NOTE]\n> Currently processing new changes in this PR. This may take a few minutes, please wait...\n> \n> \n> \n> ```ascii\n>  __________________________________________\n> < Fight fire with fire. Review AI with AI. >\n>  ------------------------------------------\n>   \\\n>    \\   (\\__/)\n>        (•ㅅ•)\n>        /   づ\n> ```\n> \n> <sub>✏️ Tip: You can disable in-progress messages and the fortune message in your review settings.</sub>\n\n<!-- end of auto-generated comment: review in progress by coderabbit.ai -->\n<!-- usage_tips_start -->\n\n> [!TIP]\n> <details>\n> <summary>CodeRabbit can use Trivy to scan for security misconfigurations and secrets in Infrastructure as Code files.</summary>\n> \n> Add a [.trivyignore file](https://aquasecurity.github.io/trivy/latest/docs/configuration/filtering/) to your project to customize which findings Trivy reports.\n> \n> </details>\n\n<!-- usage_tips_end -->\n<!-- walkthrough_start -->\n\n<details>\n<summary>📝 Walkthrough</summary>\n\n## Walkthrough\n\nReworked stdlib pattern handling: added `expect_pattern` helper, migrated pattern functions to `check_arg_count`/`expect_*` validation, removed `line`/`column` params from some natives, and adjusted interpreter call sites to wrap stdlib errors into `RuntimeError` with source-location context.\n\n## Changes\n\n|Cohort / File(s)|Summary|\n|---|---|\n|**Interpreter callsites** <br> `src/interpreter/mod.rs`|Wraps stdlib pattern helper errors with `.map_err(...)` into `RuntimeError::with_kind` using current line/column instead of passing location into helpers.|\n|**Stdlib helpers** <br> `src/stdlib/helpers.rs`|Adds `pub fn expect_pattern(...) -> Result<Rc<...>, RuntimeError>` (note: added twice in file in this diff).|\n|**Pattern stdlib implementation** <br> `src/stdlib/pattern.rs`|Replaces manual arg-count/type checks with `check_arg_count` + `expect_text`/`expect_pattern`; updates `pattern_matches`, `pattern_find`, `pattern_find_all`, `native_pattern_replace`, `native_pattern_split` logic and signatures (removes `line`,`column`), enriches match result objects, and implements full split behavior.|\n|**Tests** <br> `src/stdlib/pattern_test.rs`|Updated expected error strings to match new helper messages (e.g., \"expects 2 arguments\", \"Expected text\").|\n\n## Estimated code review effort\n\n🎯 4 (Complex) | ⏱️ ~45 minutes\n\n## Possibly related PRs\n\n- WebFirstLanguage/wfl#311: Refactors stdlib argument validation and introduces shared helpers used alongside this change.  \n- WebFirstLanguage/wfl#310: Earlier migration to `expect_*` helpers and related stdlib validation updates.  \n- WebFirstLanguage/wfl#314: Adds/extends helper-based validation (e.g., `expect_pattern`) and continues refactoring pattern-related stdlib functions.\n\n## Poem\n\n> 🐇 I nibbled through patterns, neat and small,  \n> Found helpers to catch when types may fall,  \n> Errors now point to the exact little spot,  \n> Splits and replaces behave as they ought,  \n> Hop, debug, repeat — code gardens grow tall! 🌱\n\n</details>\n\n<!-- walkthrough_end -->\n\n<!-- pre_merge_checks_walkthrough_start -->\n\n<details>\n<summary>🚥 Pre-merge checks | ✅ 3</summary>\n\n<details>\n<summary>✅ Passed checks (3 passed)</summary>\n\n|     Check name     | Status   | Explanation                                                                                                                                                             |\n| :----------------: | :------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n|  Description Check | ✅ Passed | Check skipped - CodeRabbit’s high-level summary is enabled.                                                                                                             |\n|     Title check    | ✅ Passed | The title clearly describes the main objective: deduplicating pattern argument checking logic across the codebase by refactoring pattern.rs to use centralized helpers. |\n| Docstring Coverage | ✅ Passed | Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.                                                                                    |\n\n</details>\n\n<sub>✏️ Tip: You can configure your own custom pre-merge checks in the settings.</sub>\n\n</details>\n\n<!-- pre_merge_checks_walkthrough_end -->\n\n<!-- finishing_touch_checkbox_start -->\n\n<details>\n<summary>✨ Finishing touches</summary>\n\n- [ ] <!-- {\"checkboxId\": \"7962f53c-55bc-4827-bfbf-6a18da830691\"} --> 📝 Generate docstrings\n<details>\n<summary>🧪 Generate unit tests (beta)</summary>\n\n- [ ] <!-- {\"checkboxId\": \"f47ac10b-58cc-4372-a567-0e02b2c3d479\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} -->   Create PR with unit tests\n- [ ] <!-- {\"checkboxId\": \"07f1e7d6-8a8e-4e23-9900-8731c2c87f58\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} -->   Post copyable unit tests in a comment\n- [ ] <!-- {\"checkboxId\": \"6ba7b810-9dad-11d1-80b4-00c04fd430c8\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} -->   Commit unit tests in branch `refactor-pattern-helpers-6239104481551978944`\n\n</details>\n\n</details>\n\n<!-- finishing_touch_checkbox_end -->\n\n<!-- tips_start -->\n\n---\n\nThanks for using [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=WebFirstLanguage/wfl&utm_content=334)! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.\n\n<details>\n<summary>❤️ Share</summary>\n\n- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai)\n- [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai)\n- [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai)\n- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)\n\n</details>\n\n<sub>Comment `@coderabbitai help` to get the list of available commands and usage tips.</sub>\n\n<!-- tips_end -->\n\n<!-- internal state start -->\n\n\n<!-- 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 -->\n\n<!-- internal state end -->"},"request":{"retryCount":3,"retries":3,"retryAfter":16}},"response":{"url":"https://api.github.com/repos/WebFirstLanguage/wfl/issues/comments/3870683508","status":500,"headers":{"access-control-allow-origin":"*","access-control-expose-headers":"ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset","content-length":"0","content-security-policy":"default-src 'none'","content-type":"application/json; charset=utf-8","date":"Mon, 09 Feb 2026 16:14:21 GMT","referrer-policy":"origin-when-cross-origin, strict-origin-when-cross-origin","server":"github.com","strict-transport-security":"max-age=31536000; includeSubdomains; preload","vary":"Accept-Encoding, Accept, X-Requested-With","x-accepted-github-permissions":"issues=write; pull_requests=write","x-content-type-options":"nosniff","x-frame-options":"deny","x-github-api-version-selected":"2022-11-28","x-github-media-type":"github.v3; format=json","x-github-request-id":"6885:8BA36:12EA0F:5148E2:698A07DB","x-ratelimit-limit":"5000","x-ratelimit-remaining":"4975","x-ratelimit-reset":"1770657208","x-ratelimit-resource":"core","x-ratelimit-used":"25","x-xss-protection":"0"},"data":""}}

1 similar comment
@coderabbitai

coderabbitai Bot commented Feb 9, 2026

Copy link
Copy Markdown
Contributor

Caution

Failed to replace (edit) comment. This is likely due to insufficient permissions or the comment being deleted.

Error details
{"name":"HttpError","status":500,"request":{"method":"PATCH","url":"https://api.github.com/repos/WebFirstLanguage/wfl/issues/comments/3870683508","headers":{"accept":"application/vnd.github.v3+json","user-agent":"octokit.js/0.0.0-development octokit-core.js/7.0.6 Node.js/24","authorization":"token [REDACTED]","content-type":"application/json; charset=utf-8"},"body":{"body":"<!-- This is an auto-generated comment: summarize by coderabbit.ai -->\n<!-- This is an auto-generated comment: review in progress by coderabbit.ai -->\n\n> [!NOTE]\n> Currently processing new changes in this PR. This may take a few minutes, please wait...\n> \n> \n> \n> ```ascii\n>  __________________________________________\n> < Fight fire with fire. Review AI with AI. >\n>  ------------------------------------------\n>   \\\n>    \\   (\\__/)\n>        (•ㅅ•)\n>        /   づ\n> ```\n> \n> <sub>✏️ Tip: You can disable in-progress messages and the fortune message in your review settings.</sub>\n\n<!-- end of auto-generated comment: review in progress by coderabbit.ai -->\n<!-- usage_tips_start -->\n\n> [!TIP]\n> <details>\n> <summary>CodeRabbit can use Trivy to scan for security misconfigurations and secrets in Infrastructure as Code files.</summary>\n> \n> Add a [.trivyignore file](https://aquasecurity.github.io/trivy/latest/docs/configuration/filtering/) to your project to customize which findings Trivy reports.\n> \n> </details>\n\n<!-- usage_tips_end -->\n<!-- walkthrough_start -->\n\n<details>\n<summary>📝 Walkthrough</summary>\n\n## Walkthrough\n\nReworked stdlib pattern handling: added `expect_pattern` helper, migrated pattern functions to `check_arg_count`/`expect_*` validation, removed `line`/`column` params from some natives, and adjusted interpreter call sites to wrap stdlib errors into `RuntimeError` with source-location context.\n\n## Changes\n\n|Cohort / File(s)|Summary|\n|---|---|\n|**Interpreter callsites** <br> `src/interpreter/mod.rs`|Wraps stdlib pattern helper errors with `.map_err(...)` into `RuntimeError::with_kind` using current line/column instead of passing location into helpers.|\n|**Stdlib helpers** <br> `src/stdlib/helpers.rs`|Adds `pub fn expect_pattern(...) -> Result<Rc<...>, RuntimeError>` (note: added twice in file in this diff).|\n|**Pattern stdlib implementation** <br> `src/stdlib/pattern.rs`|Replaces manual arg-count/type checks with `check_arg_count` + `expect_text`/`expect_pattern`; updates `pattern_matches`, `pattern_find`, `pattern_find_all`, `native_pattern_replace`, `native_pattern_split` logic and signatures (removes `line`,`column`), enriches match result objects, and implements full split behavior.|\n|**Tests** <br> `src/stdlib/pattern_test.rs`|Updated expected error strings to match new helper messages (e.g., \"expects 2 arguments\", \"Expected text\").|\n\n## Estimated code review effort\n\n🎯 4 (Complex) | ⏱️ ~45 minutes\n\n## Possibly related PRs\n\n- WebFirstLanguage/wfl#311: Refactors stdlib argument validation and introduces shared helpers used alongside this change.  \n- WebFirstLanguage/wfl#310: Earlier migration to `expect_*` helpers and related stdlib validation updates.  \n- WebFirstLanguage/wfl#314: Adds/extends helper-based validation (e.g., `expect_pattern`) and continues refactoring pattern-related stdlib functions.\n\n## Poem\n\n> 🐇 I nibbled through patterns, neat and small,  \n> Found helpers to catch when types may fall,  \n> Errors now point to the exact little spot,  \n> Splits and replaces behave as they ought,  \n> Hop, debug, repeat — code gardens grow tall! 🌱\n\n</details>\n\n<!-- walkthrough_end -->\n\n<!-- pre_merge_checks_walkthrough_start -->\n\n<details>\n<summary>🚥 Pre-merge checks | ✅ 3</summary>\n\n<details>\n<summary>✅ Passed checks (3 passed)</summary>\n\n|     Check name     | Status   | Explanation                                                                                                                                                             |\n| :----------------: | :------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n|  Description Check | ✅ Passed | Check skipped - CodeRabbit’s high-level summary is enabled.                                                                                                             |\n|     Title check    | ✅ Passed | The title clearly describes the main objective: deduplicating pattern argument checking logic across the codebase by refactoring pattern.rs to use centralized helpers. |\n| Docstring Coverage | ✅ Passed | Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.                                                                                    |\n\n</details>\n\n<sub>✏️ Tip: You can configure your own custom pre-merge checks in the settings.</sub>\n\n</details>\n\n<!-- pre_merge_checks_walkthrough_end -->\n\n<!-- finishing_touch_checkbox_start -->\n\n<details>\n<summary>✨ Finishing touches</summary>\n\n- [ ] <!-- {\"checkboxId\": \"7962f53c-55bc-4827-bfbf-6a18da830691\"} --> 📝 Generate docstrings\n<details>\n<summary>🧪 Generate unit tests (beta)</summary>\n\n- [ ] <!-- {\"checkboxId\": \"f47ac10b-58cc-4372-a567-0e02b2c3d479\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} -->   Create PR with unit tests\n- [ ] <!-- {\"checkboxId\": \"07f1e7d6-8a8e-4e23-9900-8731c2c87f58\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} -->   Post copyable unit tests in a comment\n- [ ] <!-- {\"checkboxId\": \"6ba7b810-9dad-11d1-80b4-00c04fd430c8\", \"radioGroupId\": \"utg-output-choice-group-unknown_comment_id\"} -->   Commit unit tests in branch `refactor-pattern-helpers-6239104481551978944`\n\n</details>\n\n</details>\n\n<!-- finishing_touch_checkbox_end -->\n\n<!-- tips_start -->\n\n---\n\nThanks for using [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=WebFirstLanguage/wfl&utm_content=334)! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.\n\n<details>\n<summary>❤️ Share</summary>\n\n- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai)\n- [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai)\n- [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai)\n- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)\n\n</details>\n\n<sub>Comment `@coderabbitai help` to get the list of available commands and usage tips.</sub>\n\n<!-- tips_end -->\n\n<!-- internal state start -->\n\n\n<!-- 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 -->\n\n<!-- internal state end -->"},"request":{"retryCount":3,"retries":3,"retryAfter":16}},"response":{"url":"https://api.github.com/repos/WebFirstLanguage/wfl/issues/comments/3870683508","status":500,"headers":{"access-control-allow-origin":"*","access-control-expose-headers":"ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset","content-length":"0","content-security-policy":"default-src 'none'","content-type":"application/json; charset=utf-8","date":"Mon, 09 Feb 2026 16:14:21 GMT","referrer-policy":"origin-when-cross-origin, strict-origin-when-cross-origin","server":"github.com","strict-transport-security":"max-age=31536000; includeSubdomains; preload","vary":"Accept-Encoding, Accept, X-Requested-With","x-accepted-github-permissions":"issues=write; pull_requests=write","x-content-type-options":"nosniff","x-frame-options":"deny","x-github-api-version-selected":"2022-11-28","x-github-media-type":"github.v3; format=json","x-github-request-id":"6885:8BA36:12EA0F:5148E2:698A07DB","x-ratelimit-limit":"5000","x-ratelimit-remaining":"4975","x-ratelimit-reset":"1770657208","x-ratelimit-resource":"core","x-ratelimit-used":"25","x-xss-protection":"0"},"data":""}}

Co-authored-by: logbie <1138960+logbie@users.noreply.github.com>
@logbie logbie closed this Feb 11, 2026
@logbie
logbie deleted the refactor-pattern-helpers-6239104481551978944 branch February 20, 2026 07:02
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants