fix(tauri): Extract IPC types to shared module for Windows compatibility - #16

Merged
wilcorrea merged 1 commit into
mainfrom
fix/windows-build
Feb 23, 2026
Merged

fix(tauri): Extract IPC types to shared module for Windows compatibility#16
wilcorrea merged 1 commit into
mainfrom
fix/windows-build

Conversation

@wilcorrea

@wilcorreawilcorrea commented Feb 23, 2026

Copy link
Copy Markdown
Contributor

Summary

Fixes the Windows build failure in release v0.5.1.

The Windows build was failing with:

error[E0432]: unresolved import `crate::ipc`
error: could not compile `arandu` (lib) due to 1 previous error

Root Cause

The tcp_ipc module was trying to import types from the ipc module, which is Unix-only (#[cfg(unix)]). On Windows, this module doesn't exist, causing the import to fail.

Solution

  • Created ipc_common.rs module with shared types and logic:
    • IpcCommand struct
    • IpcResponse struct
    • process_command() function
  • This module compiles on all platforms (no cfg restrictions)
  • Both ipc.rs (Unix socket) and tcp_ipc.rs (TCP) now import from ipc_common
  • Removed duplicate code from ipc.rs

Test Plan

  • ✅ Verified compilation on macOS: cargo check
  • Verify Windows build succeeds in CI
  • Verify Linux builds succeed in CI
  • Verify macOS builds succeed in CI
  • Check that release v0.5.1 completes successfully

Related

Summary by CodeRabbit

  • Chores
    • Reorganized internal IPC command handling to consolidate shared functionality into a common module for improved code reusability and maintainability.

The Windows build was failing because tcp_ipc was trying to import types
from the ipc module, which is Unix-only (#[cfg(unix)]). This caused:
error[E0432]: unresolved import `crate::ipc`
Solution:
- Created ipc_common.rs with IpcCommand, IpcResponse, and process_command
- This module compiles on all platforms (no cfg restrictions)
- Both ipc.rs (Unix socket) and tcp_ipc.rs (TCP) now import from ipc_common
- Removed duplicate code from ipc.rs
This fixes the Windows release build failure in v0.5.1.
@coderabbitai

coderabbitaiBot commented Feb 23, 2026

Copy link
Copy Markdown
📝 Walkthrough

Walkthrough

Extract and consolidate IPC command types and processing logic into a shared ipc_common module. Public types IpcCommand and IpcResponse, along with process_command function, are moved from ipc.rs to the new module. ipc.rs and tcp_ipc.rs updated to import from shared definitions.

Changes

Cohort / File(s)Summary
Code Reorganization
ipc.rs
Removed local definitions of IpcCommand, IpcResponse types and process_command function; added imports from shared ipc_common module. Handle client flow remains unchanged, now delegating to shared command processor.
Shared IPC Module
ipc_common.rs
New module containing IpcCommand (with deserialize support), IpcResponse (with serialize support), and process_command function. Handles "open", "ping", "show" commands with window management and event emission.
Module Declaration & Import Updates
lib.rs, tcp_ipc.rs
Module declaration added for ipc_common under macOS configuration. Import path in tcp_ipc.rs updated from crate::ipc to crate::ipc_common.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~8 minutes

Possibly related PRs

Poem

🐰 A little hop and a skip, I see,
The IPC commands now live in harmony!
Shared wisdom in ipc_common so fine,
No more duplication—just code that's divine! 🎯

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 33.33% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title accurately describes the main objective: extracting IPC types to a shared module to resolve Windows compatibility issues.

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

✨ Finishing Touches
  • 📝 Generate docstrings (stacked PR)
  • 📝 Generate docstrings (commit on current branch)
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch fix/windows-build

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.

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🧹 Nitpick comments (1)
apps/tauri/src-tauri/src/ipc_common.rs (1)

8-9: #[serde(default)] on Option<String> is redundant.

Serde already deserializes a missing JSON field as None for any Option<T> without needing the attribute. The annotation is harmless but adds noise.

♻️ Suggested cleanup
- #[serde(default)]
pub path: Option<String>,
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@apps/tauri/src-tauri/src/ipc_common.rs` around lines 8 - 9, The
#[serde(default)] attribute on the struct field `path: Option<String>` is
redundant; remove the #[serde(default)] attribute applied to `path` (the
`Option<String>` field) so Serde will naturally treat a missing field as
None—update the declaration that contains `path` to simply be `pub path:
Option<String>` and ensure no other serde attributes are needed for that field.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@apps/tauri/src-tauri/src/ipc_common.rs`:
- Around line 25-27: std::fs::canonicalize produces Windows extended-length
paths prefixed with "\\?\" which breaks downstream consumers (e.g., Node.js);
update the canonicalization in ipc_common.rs where canonicalize(&path) and
path_str are produced to remove the "\\?\" prefix on Windows (e.g., check if
path_str starts with r"\\?\" and strip that prefix) or replace the call with
dunce::canonicalize (add dunce = "1" to Cargo.toml) so the returned path string
is safe for the frontend "open-file" handler; ensure the adjusted path_str is
used in the existing code paths that emit the IPC event.
---
Nitpick comments:
In `@apps/tauri/src-tauri/src/ipc_common.rs`:
- Around line 8-9: The #[serde(default)] attribute on the struct field `path:
Option<String>` is redundant; remove the #[serde(default)] attribute applied to
`path` (the `Option<String>` field) so Serde will naturally treat a missing
field as None—update the declaration that contains `path` to simply be `pub
path: Option<String>` and ensure no other serde attributes are needed for that
field.

ℹ️ Review info

Configuration used: defaults

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 31f187b and 5e7824c.

📒 Files selected for processing (4)
  • apps/tauri/src-tauri/src/ipc.rs
  • apps/tauri/src-tauri/src/ipc_common.rs
  • apps/tauri/src-tauri/src/lib.rs
  • apps/tauri/src-tauri/src/tcp_ipc.rs

Comment on lines +25 to +27
match std::fs::canonicalize(&path) {
Ok(abs_path) => {
let path_str = abs_path.to_string_lossy().to_string();

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

std::fs::canonicalize emits \\?\-prefixed UNC paths on Windows.

On Windows, canonicalize converts the path to use extended-length path syntax (\\?\...), which may be incompatible with other applications. Node.js crashes when given such a \\?\-prefixed UNC path, meaning the frontend "open-file" event handler will receive a broken path string on Windows — the primary platform this PR adds support for.

Consider stripping the prefix after canonicalization, or using the dunce crate, which is frequently used as a wrapper over std::fs::canonicalize to strip the \\?\ prefix.

🛡️ Suggested fix (manual prefix strip, no extra dep)
- Ok(abs_path) => {- let path_str = abs_path.to_string_lossy().to_string();+ Ok(abs_path) => {+ // Strip Windows extended-length prefix so the frontend+ // receives a plain path like C:\... instead of \\?\C:\...+ let path_str = abs_path.to_string_lossy()+ .strip_prefix(r"\\?\")+ .map(str::to_string)+ .unwrap_or_else(|| abs_path.to_string_lossy().to_string());

Alternatively, add dunce = "1" to Cargo.toml and use:

let abs_path = dunce::canonicalize(&path).map_err(...)?;
📝 Committable suggestion

‼️IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
match std::fs::canonicalize(&path){
Ok(abs_path) => {
let path_str = abs_path.to_string_lossy().to_string();
match std::fs::canonicalize(&path){
Ok(abs_path) => {
// Strip Windows extended-length prefix so the frontend
// receives a plain path like C:\... instead of \\?\C:\...
let path_str = abs_path.to_string_lossy()
.strip_prefix(r"\\?\")
.map(str::to_string)
.unwrap_or_else(|| abs_path.to_string_lossy().to_string());
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@apps/tauri/src-tauri/src/ipc_common.rs` around lines 25 - 27,
std::fs::canonicalize produces Windows extended-length paths prefixed with
"\\?\" which breaks downstream consumers (e.g., Node.js); update the
canonicalization in ipc_common.rs where canonicalize(&path) and path_str are
produced to remove the "\\?\" prefix on Windows (e.g., check if path_str starts
with r"\\?\" and strip that prefix) or replace the call with dunce::canonicalize
(add dunce = "1" to Cargo.toml) so the returned path string is safe for the
frontend "open-file" handler; ensure the adjusted path_str is used in the
existing code paths that emit the IPC event.

@wilcorrea
wilcorrea merged commit 711222c into mainFeb 23, 2026
1 check passed
@wilcorrea
wilcorrea deleted the fix/windows-build branch February 23, 2026 21:44
Sign up for freeto 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.

1 participant

@wilcorrea
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

fix(tauri): Extract IPC types to shared module for Windows compatibility - #16

Merged
wilcorrea merged 1 commit into
mainfrom
fix/windows-build
Feb 23, 2026
Merged

fix(tauri): Extract IPC types to shared module for Windows compatibility#16
wilcorrea merged 1 commit into
mainfrom
fix/windows-build

Conversation

@wilcorrea

@wilcorreawilcorrea commented Feb 23, 2026

Copy link
Copy Markdown
Contributor

Summary

Fixes the Windows build failure in release v0.5.1.

The Windows build was failing with:

error[E0432]: unresolved import `crate::ipc`
error: could not compile `arandu` (lib) due to 1 previous error

Root Cause

The tcp_ipc module was trying to import types from the ipc module, which is Unix-only (#[cfg(unix)]). On Windows, this module doesn't exist, causing the import to fail.

Solution

  • Created ipc_common.rs module with shared types and logic:
    • IpcCommand struct
    • IpcResponse struct
    • process_command() function
  • This module compiles on all platforms (no cfg restrictions)
  • Both ipc.rs (Unix socket) and tcp_ipc.rs (TCP) now import from ipc_common
  • Removed duplicate code from ipc.rs

Test Plan

  • ✅ Verified compilation on macOS: cargo check
  • Verify Windows build succeeds in CI
  • Verify Linux builds succeed in CI
  • Verify macOS builds succeed in CI
  • Check that release v0.5.1 completes successfully

Related

Summary by CodeRabbit

  • Chores
    • Reorganized internal IPC command handling to consolidate shared functionality into a common module for improved code reusability and maintainability.

The Windows build was failing because tcp_ipc was trying to import types
from the ipc module, which is Unix-only (#[cfg(unix)]). This caused:
error[E0432]: unresolved import `crate::ipc`
Solution:
- Created ipc_common.rs with IpcCommand, IpcResponse, and process_command
- This module compiles on all platforms (no cfg restrictions)
- Both ipc.rs (Unix socket) and tcp_ipc.rs (TCP) now import from ipc_common
- Removed duplicate code from ipc.rs
This fixes the Windows release build failure in v0.5.1.
@coderabbitai

coderabbitaiBot commented Feb 23, 2026

Copy link
Copy Markdown
📝 Walkthrough

Walkthrough

Extract and consolidate IPC command types and processing logic into a shared ipc_common module. Public types IpcCommand and IpcResponse, along with process_command function, are moved from ipc.rs to the new module. ipc.rs and tcp_ipc.rs updated to import from shared definitions.

Changes

Cohort / File(s)Summary
Code Reorganization
ipc.rs
Removed local definitions of IpcCommand, IpcResponse types and process_command function; added imports from shared ipc_common module. Handle client flow remains unchanged, now delegating to shared command processor.
Shared IPC Module
ipc_common.rs
New module containing IpcCommand (with deserialize support), IpcResponse (with serialize support), and process_command function. Handles "open", "ping", "show" commands with window management and event emission.
Module Declaration & Import Updates
lib.rs, tcp_ipc.rs
Module declaration added for ipc_common under macOS configuration. Import path in tcp_ipc.rs updated from crate::ipc to crate::ipc_common.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~8 minutes

Possibly related PRs

Poem

🐰 A little hop and a skip, I see,
The IPC commands now live in harmony!
Shared wisdom in ipc_common so fine,
No more duplication—just code that's divine! 🎯

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 33.33% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title accurately describes the main objective: extracting IPC types to a shared module to resolve Windows compatibility issues.

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

✨ Finishing Touches
  • 📝 Generate docstrings (stacked PR)
  • 📝 Generate docstrings (commit on current branch)
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch fix/windows-build

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.

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🧹 Nitpick comments (1)
apps/tauri/src-tauri/src/ipc_common.rs (1)

8-9: #[serde(default)] on Option<String> is redundant.

Serde already deserializes a missing JSON field as None for any Option<T> without needing the attribute. The annotation is harmless but adds noise.

♻️ Suggested cleanup
- #[serde(default)]
pub path: Option<String>,
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@apps/tauri/src-tauri/src/ipc_common.rs` around lines 8 - 9, The
#[serde(default)] attribute on the struct field `path: Option<String>` is
redundant; remove the #[serde(default)] attribute applied to `path` (the
`Option<String>` field) so Serde will naturally treat a missing field as
None—update the declaration that contains `path` to simply be `pub path:
Option<String>` and ensure no other serde attributes are needed for that field.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@apps/tauri/src-tauri/src/ipc_common.rs`:
- Around line 25-27: std::fs::canonicalize produces Windows extended-length
paths prefixed with "\\?\" which breaks downstream consumers (e.g., Node.js);
update the canonicalization in ipc_common.rs where canonicalize(&path) and
path_str are produced to remove the "\\?\" prefix on Windows (e.g., check if
path_str starts with r"\\?\" and strip that prefix) or replace the call with
dunce::canonicalize (add dunce = "1" to Cargo.toml) so the returned path string
is safe for the frontend "open-file" handler; ensure the adjusted path_str is
used in the existing code paths that emit the IPC event.
---
Nitpick comments:
In `@apps/tauri/src-tauri/src/ipc_common.rs`:
- Around line 8-9: The #[serde(default)] attribute on the struct field `path:
Option<String>` is redundant; remove the #[serde(default)] attribute applied to
`path` (the `Option<String>` field) so Serde will naturally treat a missing
field as None—update the declaration that contains `path` to simply be `pub
path: Option<String>` and ensure no other serde attributes are needed for that
field.

ℹ️ Review info

Configuration used: defaults

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 31f187b and 5e7824c.

📒 Files selected for processing (4)
  • apps/tauri/src-tauri/src/ipc.rs
  • apps/tauri/src-tauri/src/ipc_common.rs
  • apps/tauri/src-tauri/src/lib.rs
  • apps/tauri/src-tauri/src/tcp_ipc.rs

Comment on lines +25 to +27
match std::fs::canonicalize(&path) {
Ok(abs_path) => {
let path_str = abs_path.to_string_lossy().to_string();

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

std::fs::canonicalize emits \\?\-prefixed UNC paths on Windows.

On Windows, canonicalize converts the path to use extended-length path syntax (\\?\...), which may be incompatible with other applications. Node.js crashes when given such a \\?\-prefixed UNC path, meaning the frontend "open-file" event handler will receive a broken path string on Windows — the primary platform this PR adds support for.

Consider stripping the prefix after canonicalization, or using the dunce crate, which is frequently used as a wrapper over std::fs::canonicalize to strip the \\?\ prefix.

🛡️ Suggested fix (manual prefix strip, no extra dep)
- Ok(abs_path) => {- let path_str = abs_path.to_string_lossy().to_string();+ Ok(abs_path) => {+ // Strip Windows extended-length prefix so the frontend+ // receives a plain path like C:\... instead of \\?\C:\...+ let path_str = abs_path.to_string_lossy()+ .strip_prefix(r"\\?\")+ .map(str::to_string)+ .unwrap_or_else(|| abs_path.to_string_lossy().to_string());

Alternatively, add dunce = "1" to Cargo.toml and use:

let abs_path = dunce::canonicalize(&path).map_err(...)?;
📝 Committable suggestion

‼️IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
match std::fs::canonicalize(&path){
Ok(abs_path) => {
let path_str = abs_path.to_string_lossy().to_string();
match std::fs::canonicalize(&path){
Ok(abs_path) => {
// Strip Windows extended-length prefix so the frontend
// receives a plain path like C:\... instead of \\?\C:\...
let path_str = abs_path.to_string_lossy()
.strip_prefix(r"\\?\")
.map(str::to_string)
.unwrap_or_else(|| abs_path.to_string_lossy().to_string());
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@apps/tauri/src-tauri/src/ipc_common.rs` around lines 25 - 27,
std::fs::canonicalize produces Windows extended-length paths prefixed with
"\\?\" which breaks downstream consumers (e.g., Node.js); update the
canonicalization in ipc_common.rs where canonicalize(&path) and path_str are
produced to remove the "\\?\" prefix on Windows (e.g., check if path_str starts
with r"\\?\" and strip that prefix) or replace the call with dunce::canonicalize
(add dunce = "1" to Cargo.toml) so the returned path string is safe for the
frontend "open-file" handler; ensure the adjusted path_str is used in the
existing code paths that emit the IPC event.

@wilcorrea
wilcorrea merged commit 711222c into mainFeb 23, 2026
1 check passed
@wilcorrea
wilcorrea deleted the fix/windows-build branch February 23, 2026 21:44
Sign up for freeto 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.

1 participant

@wilcorrea
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(tauri): Extract IPC types to shared module for Windows compatibility - #16

Merged
wilcorrea merged 1 commit into
mainfrom
fix/windows-build
Feb 23, 2026
Merged

fix(tauri): Extract IPC types to shared module for Windows compatibility#16
wilcorrea merged 1 commit into
mainfrom
fix/windows-build

Conversation

@wilcorrea

@wilcorreawilcorrea commented Feb 23, 2026

Copy link
Copy Markdown
Contributor

Summary

Fixes the Windows build failure in release v0.5.1.

The Windows build was failing with:

error[E0432]: unresolved import `crate::ipc`
error: could not compile `arandu` (lib) due to 1 previous error

Root Cause

The tcp_ipc module was trying to import types from the ipc module, which is Unix-only (#[cfg(unix)]). On Windows, this module doesn't exist, causing the import to fail.

Solution

  • Created ipc_common.rs module with shared types and logic:
    • IpcCommand struct
    • IpcResponse struct
    • process_command() function
  • This module compiles on all platforms (no cfg restrictions)
  • Both ipc.rs (Unix socket) and tcp_ipc.rs (TCP) now import from ipc_common
  • Removed duplicate code from ipc.rs

Test Plan

  • ✅ Verified compilation on macOS: cargo check
  • Verify Windows build succeeds in CI
  • Verify Linux builds succeed in CI
  • Verify macOS builds succeed in CI
  • Check that release v0.5.1 completes successfully

Related

Summary by CodeRabbit

  • Chores
    • Reorganized internal IPC command handling to consolidate shared functionality into a common module for improved code reusability and maintainability.

The Windows build was failing because tcp_ipc was trying to import types
from the ipc module, which is Unix-only (#[cfg(unix)]). This caused:
error[E0432]: unresolved import `crate::ipc`
Solution:
- Created ipc_common.rs with IpcCommand, IpcResponse, and process_command
- This module compiles on all platforms (no cfg restrictions)
- Both ipc.rs (Unix socket) and tcp_ipc.rs (TCP) now import from ipc_common
- Removed duplicate code from ipc.rs
This fixes the Windows release build failure in v0.5.1.
@coderabbitai

coderabbitaiBot commented Feb 23, 2026

Copy link
Copy Markdown
📝 Walkthrough

Walkthrough

Extract and consolidate IPC command types and processing logic into a shared ipc_common module. Public types IpcCommand and IpcResponse, along with process_command function, are moved from ipc.rs to the new module. ipc.rs and tcp_ipc.rs updated to import from shared definitions.

Changes

Cohort / File(s)Summary
Code Reorganization
ipc.rs
Removed local definitions of IpcCommand, IpcResponse types and process_command function; added imports from shared ipc_common module. Handle client flow remains unchanged, now delegating to shared command processor.
Shared IPC Module
ipc_common.rs
New module containing IpcCommand (with deserialize support), IpcResponse (with serialize support), and process_command function. Handles "open", "ping", "show" commands with window management and event emission.
Module Declaration & Import Updates
lib.rs, tcp_ipc.rs
Module declaration added for ipc_common under macOS configuration. Import path in tcp_ipc.rs updated from crate::ipc to crate::ipc_common.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~8 minutes

Possibly related PRs

Poem

🐰 A little hop and a skip, I see,
The IPC commands now live in harmony!
Shared wisdom in ipc_common so fine,
No more duplication—just code that's divine! 🎯

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 33.33% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title accurately describes the main objective: extracting IPC types to a shared module to resolve Windows compatibility issues.

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

✨ Finishing Touches
  • 📝 Generate docstrings (stacked PR)
  • 📝 Generate docstrings (commit on current branch)
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch fix/windows-build

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.

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🧹 Nitpick comments (1)
apps/tauri/src-tauri/src/ipc_common.rs (1)

8-9: #[serde(default)] on Option<String> is redundant.

Serde already deserializes a missing JSON field as None for any Option<T> without needing the attribute. The annotation is harmless but adds noise.

♻️ Suggested cleanup
- #[serde(default)]
pub path: Option<String>,
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@apps/tauri/src-tauri/src/ipc_common.rs` around lines 8 - 9, The
#[serde(default)] attribute on the struct field `path: Option<String>` is
redundant; remove the #[serde(default)] attribute applied to `path` (the
`Option<String>` field) so Serde will naturally treat a missing field as
None—update the declaration that contains `path` to simply be `pub path:
Option<String>` and ensure no other serde attributes are needed for that field.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@apps/tauri/src-tauri/src/ipc_common.rs`:
- Around line 25-27: std::fs::canonicalize produces Windows extended-length
paths prefixed with "\\?\" which breaks downstream consumers (e.g., Node.js);
update the canonicalization in ipc_common.rs where canonicalize(&path) and
path_str are produced to remove the "\\?\" prefix on Windows (e.g., check if
path_str starts with r"\\?\" and strip that prefix) or replace the call with
dunce::canonicalize (add dunce = "1" to Cargo.toml) so the returned path string
is safe for the frontend "open-file" handler; ensure the adjusted path_str is
used in the existing code paths that emit the IPC event.
---
Nitpick comments:
In `@apps/tauri/src-tauri/src/ipc_common.rs`:
- Around line 8-9: The #[serde(default)] attribute on the struct field `path:
Option<String>` is redundant; remove the #[serde(default)] attribute applied to
`path` (the `Option<String>` field) so Serde will naturally treat a missing
field as None—update the declaration that contains `path` to simply be `pub
path: Option<String>` and ensure no other serde attributes are needed for that
field.

ℹ️ Review info

Configuration used: defaults

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 31f187b and 5e7824c.

📒 Files selected for processing (4)
  • apps/tauri/src-tauri/src/ipc.rs
  • apps/tauri/src-tauri/src/ipc_common.rs
  • apps/tauri/src-tauri/src/lib.rs
  • apps/tauri/src-tauri/src/tcp_ipc.rs

Comment on lines +25 to +27
match std::fs::canonicalize(&path) {
Ok(abs_path) => {
let path_str = abs_path.to_string_lossy().to_string();

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

std::fs::canonicalize emits \\?\-prefixed UNC paths on Windows.

On Windows, canonicalize converts the path to use extended-length path syntax (\\?\...), which may be incompatible with other applications. Node.js crashes when given such a \\?\-prefixed UNC path, meaning the frontend "open-file" event handler will receive a broken path string on Windows — the primary platform this PR adds support for.

Consider stripping the prefix after canonicalization, or using the dunce crate, which is frequently used as a wrapper over std::fs::canonicalize to strip the \\?\ prefix.

🛡️ Suggested fix (manual prefix strip, no extra dep)
- Ok(abs_path) => {- let path_str = abs_path.to_string_lossy().to_string();+ Ok(abs_path) => {+ // Strip Windows extended-length prefix so the frontend+ // receives a plain path like C:\... instead of \\?\C:\...+ let path_str = abs_path.to_string_lossy()+ .strip_prefix(r"\\?\")+ .map(str::to_string)+ .unwrap_or_else(|| abs_path.to_string_lossy().to_string());

Alternatively, add dunce = "1" to Cargo.toml and use:

let abs_path = dunce::canonicalize(&path).map_err(...)?;
📝 Committable suggestion

‼️IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
match std::fs::canonicalize(&path){
Ok(abs_path) => {
let path_str = abs_path.to_string_lossy().to_string();
match std::fs::canonicalize(&path){
Ok(abs_path) => {
// Strip Windows extended-length prefix so the frontend
// receives a plain path like C:\... instead of \\?\C:\...
let path_str = abs_path.to_string_lossy()
.strip_prefix(r"\\?\")
.map(str::to_string)
.unwrap_or_else(|| abs_path.to_string_lossy().to_string());
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@apps/tauri/src-tauri/src/ipc_common.rs` around lines 25 - 27,
std::fs::canonicalize produces Windows extended-length paths prefixed with
"\\?\" which breaks downstream consumers (e.g., Node.js); update the
canonicalization in ipc_common.rs where canonicalize(&path) and path_str are
produced to remove the "\\?\" prefix on Windows (e.g., check if path_str starts
with r"\\?\" and strip that prefix) or replace the call with dunce::canonicalize
(add dunce = "1" to Cargo.toml) so the returned path string is safe for the
frontend "open-file" handler; ensure the adjusted path_str is used in the
existing code paths that emit the IPC event.

@wilcorrea
wilcorrea merged commit 711222c into mainFeb 23, 2026
1 check passed
@wilcorrea
wilcorrea deleted the fix/windows-build branch February 23, 2026 21:44
Sign up for freeto 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.

1 participant

@wilcorrea
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(tauri): Extract IPC types to shared module for Windows compatibility - #16

Merged
wilcorrea merged 1 commit into
mainfrom
fix/windows-build
Feb 23, 2026
Merged

fix(tauri): Extract IPC types to shared module for Windows compatibility#16
wilcorrea merged 1 commit into
mainfrom
fix/windows-build

Conversation

@wilcorrea

@wilcorreawilcorrea commented Feb 23, 2026

Copy link
Copy Markdown
Contributor

Summary

Fixes the Windows build failure in release v0.5.1.

The Windows build was failing with:

error[E0432]: unresolved import `crate::ipc`
error: could not compile `arandu` (lib) due to 1 previous error

Root Cause

The tcp_ipc module was trying to import types from the ipc module, which is Unix-only (#[cfg(unix)]). On Windows, this module doesn't exist, causing the import to fail.

Solution

  • Created ipc_common.rs module with shared types and logic:
    • IpcCommand struct
    • IpcResponse struct
    • process_command() function
  • This module compiles on all platforms (no cfg restrictions)
  • Both ipc.rs (Unix socket) and tcp_ipc.rs (TCP) now import from ipc_common
  • Removed duplicate code from ipc.rs

Test Plan

  • ✅ Verified compilation on macOS: cargo check
  • Verify Windows build succeeds in CI
  • Verify Linux builds succeed in CI
  • Verify macOS builds succeed in CI
  • Check that release v0.5.1 completes successfully

Related

Summary by CodeRabbit

  • Chores
    • Reorganized internal IPC command handling to consolidate shared functionality into a common module for improved code reusability and maintainability.

The Windows build was failing because tcp_ipc was trying to import types
from the ipc module, which is Unix-only (#[cfg(unix)]). This caused:
error[E0432]: unresolved import `crate::ipc`
Solution:
- Created ipc_common.rs with IpcCommand, IpcResponse, and process_command
- This module compiles on all platforms (no cfg restrictions)
- Both ipc.rs (Unix socket) and tcp_ipc.rs (TCP) now import from ipc_common
- Removed duplicate code from ipc.rs
This fixes the Windows release build failure in v0.5.1.
@coderabbitai

coderabbitaiBot commented Feb 23, 2026

Copy link
Copy Markdown
📝 Walkthrough

Walkthrough

Extract and consolidate IPC command types and processing logic into a shared ipc_common module. Public types IpcCommand and IpcResponse, along with process_command function, are moved from ipc.rs to the new module. ipc.rs and tcp_ipc.rs updated to import from shared definitions.

Changes

Cohort / File(s)Summary
Code Reorganization
ipc.rs
Removed local definitions of IpcCommand, IpcResponse types and process_command function; added imports from shared ipc_common module. Handle client flow remains unchanged, now delegating to shared command processor.
Shared IPC Module
ipc_common.rs
New module containing IpcCommand (with deserialize support), IpcResponse (with serialize support), and process_command function. Handles "open", "ping", "show" commands with window management and event emission.
Module Declaration & Import Updates
lib.rs, tcp_ipc.rs
Module declaration added for ipc_common under macOS configuration. Import path in tcp_ipc.rs updated from crate::ipc to crate::ipc_common.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~8 minutes

Possibly related PRs

Poem

🐰 A little hop and a skip, I see,
The IPC commands now live in harmony!
Shared wisdom in ipc_common so fine,
No more duplication—just code that's divine! 🎯

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 33.33% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title accurately describes the main objective: extracting IPC types to a shared module to resolve Windows compatibility issues.

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

✨ Finishing Touches
  • 📝 Generate docstrings (stacked PR)
  • 📝 Generate docstrings (commit on current branch)
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch fix/windows-build

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.

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🧹 Nitpick comments (1)
apps/tauri/src-tauri/src/ipc_common.rs (1)

8-9: #[serde(default)] on Option<String> is redundant.

Serde already deserializes a missing JSON field as None for any Option<T> without needing the attribute. The annotation is harmless but adds noise.

♻️ Suggested cleanup
- #[serde(default)]
pub path: Option<String>,
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@apps/tauri/src-tauri/src/ipc_common.rs` around lines 8 - 9, The
#[serde(default)] attribute on the struct field `path: Option<String>` is
redundant; remove the #[serde(default)] attribute applied to `path` (the
`Option<String>` field) so Serde will naturally treat a missing field as
None—update the declaration that contains `path` to simply be `pub path:
Option<String>` and ensure no other serde attributes are needed for that field.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@apps/tauri/src-tauri/src/ipc_common.rs`:
- Around line 25-27: std::fs::canonicalize produces Windows extended-length
paths prefixed with "\\?\" which breaks downstream consumers (e.g., Node.js);
update the canonicalization in ipc_common.rs where canonicalize(&path) and
path_str are produced to remove the "\\?\" prefix on Windows (e.g., check if
path_str starts with r"\\?\" and strip that prefix) or replace the call with
dunce::canonicalize (add dunce = "1" to Cargo.toml) so the returned path string
is safe for the frontend "open-file" handler; ensure the adjusted path_str is
used in the existing code paths that emit the IPC event.
---
Nitpick comments:
In `@apps/tauri/src-tauri/src/ipc_common.rs`:
- Around line 8-9: The #[serde(default)] attribute on the struct field `path:
Option<String>` is redundant; remove the #[serde(default)] attribute applied to
`path` (the `Option<String>` field) so Serde will naturally treat a missing
field as None—update the declaration that contains `path` to simply be `pub
path: Option<String>` and ensure no other serde attributes are needed for that
field.

ℹ️ Review info

Configuration used: defaults

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 31f187b and 5e7824c.

📒 Files selected for processing (4)
  • apps/tauri/src-tauri/src/ipc.rs
  • apps/tauri/src-tauri/src/ipc_common.rs
  • apps/tauri/src-tauri/src/lib.rs
  • apps/tauri/src-tauri/src/tcp_ipc.rs

Comment on lines +25 to +27
match std::fs::canonicalize(&path) {
Ok(abs_path) => {
let path_str = abs_path.to_string_lossy().to_string();

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

std::fs::canonicalize emits \\?\-prefixed UNC paths on Windows.

On Windows, canonicalize converts the path to use extended-length path syntax (\\?\...), which may be incompatible with other applications. Node.js crashes when given such a \\?\-prefixed UNC path, meaning the frontend "open-file" event handler will receive a broken path string on Windows — the primary platform this PR adds support for.

Consider stripping the prefix after canonicalization, or using the dunce crate, which is frequently used as a wrapper over std::fs::canonicalize to strip the \\?\ prefix.

🛡️ Suggested fix (manual prefix strip, no extra dep)
- Ok(abs_path) => {- let path_str = abs_path.to_string_lossy().to_string();+ Ok(abs_path) => {+ // Strip Windows extended-length prefix so the frontend+ // receives a plain path like C:\... instead of \\?\C:\...+ let path_str = abs_path.to_string_lossy()+ .strip_prefix(r"\\?\")+ .map(str::to_string)+ .unwrap_or_else(|| abs_path.to_string_lossy().to_string());

Alternatively, add dunce = "1" to Cargo.toml and use:

let abs_path = dunce::canonicalize(&path).map_err(...)?;
📝 Committable suggestion

‼️IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
match std::fs::canonicalize(&path){
Ok(abs_path) => {
let path_str = abs_path.to_string_lossy().to_string();
match std::fs::canonicalize(&path){
Ok(abs_path) => {
// Strip Windows extended-length prefix so the frontend
// receives a plain path like C:\... instead of \\?\C:\...
let path_str = abs_path.to_string_lossy()
.strip_prefix(r"\\?\")
.map(str::to_string)
.unwrap_or_else(|| abs_path.to_string_lossy().to_string());
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@apps/tauri/src-tauri/src/ipc_common.rs` around lines 25 - 27,
std::fs::canonicalize produces Windows extended-length paths prefixed with
"\\?\" which breaks downstream consumers (e.g., Node.js); update the
canonicalization in ipc_common.rs where canonicalize(&path) and path_str are
produced to remove the "\\?\" prefix on Windows (e.g., check if path_str starts
with r"\\?\" and strip that prefix) or replace the call with dunce::canonicalize
(add dunce = "1" to Cargo.toml) so the returned path string is safe for the
frontend "open-file" handler; ensure the adjusted path_str is used in the
existing code paths that emit the IPC event.

@wilcorrea
wilcorrea merged commit 711222c into mainFeb 23, 2026
1 check passed
@wilcorrea
wilcorrea deleted the fix/windows-build branch February 23, 2026 21:44
Sign up for freeto 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.

1 participant

@wilcorrea
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

fix(tauri): Extract IPC types to shared module for Windows compatibility - #16

Merged
wilcorrea merged 1 commit into
mainfrom
fix/windows-build
Feb 23, 2026
Merged

fix(tauri): Extract IPC types to shared module for Windows compatibility#16
wilcorrea merged 1 commit into
mainfrom
fix/windows-build

Conversation

@wilcorrea

@wilcorreawilcorrea commented Feb 23, 2026

Copy link
Copy Markdown
Contributor

Summary

Fixes the Windows build failure in release v0.5.1.

The Windows build was failing with:

error[E0432]: unresolved import `crate::ipc`
error: could not compile `arandu` (lib) due to 1 previous error

Root Cause

The tcp_ipc module was trying to import types from the ipc module, which is Unix-only (#[cfg(unix)]). On Windows, this module doesn't exist, causing the import to fail.

Solution

  • Created ipc_common.rs module with shared types and logic:
    • IpcCommand struct
    • IpcResponse struct
    • process_command() function
  • This module compiles on all platforms (no cfg restrictions)
  • Both ipc.rs (Unix socket) and tcp_ipc.rs (TCP) now import from ipc_common
  • Removed duplicate code from ipc.rs

Test Plan

  • ✅ Verified compilation on macOS: cargo check
  • Verify Windows build succeeds in CI
  • Verify Linux builds succeed in CI
  • Verify macOS builds succeed in CI
  • Check that release v0.5.1 completes successfully

Related

Summary by CodeRabbit

  • Chores
    • Reorganized internal IPC command handling to consolidate shared functionality into a common module for improved code reusability and maintainability.

The Windows build was failing because tcp_ipc was trying to import types
from the ipc module, which is Unix-only (#[cfg(unix)]). This caused:
error[E0432]: unresolved import `crate::ipc`
Solution:
- Created ipc_common.rs with IpcCommand, IpcResponse, and process_command
- This module compiles on all platforms (no cfg restrictions)
- Both ipc.rs (Unix socket) and tcp_ipc.rs (TCP) now import from ipc_common
- Removed duplicate code from ipc.rs
This fixes the Windows release build failure in v0.5.1.
@coderabbitai

coderabbitaiBot commented Feb 23, 2026

Copy link
Copy Markdown
📝 Walkthrough

Walkthrough

Extract and consolidate IPC command types and processing logic into a shared ipc_common module. Public types IpcCommand and IpcResponse, along with process_command function, are moved from ipc.rs to the new module. ipc.rs and tcp_ipc.rs updated to import from shared definitions.

Changes

Cohort / File(s)Summary
Code Reorganization
ipc.rs
Removed local definitions of IpcCommand, IpcResponse types and process_command function; added imports from shared ipc_common module. Handle client flow remains unchanged, now delegating to shared command processor.
Shared IPC Module
ipc_common.rs
New module containing IpcCommand (with deserialize support), IpcResponse (with serialize support), and process_command function. Handles "open", "ping", "show" commands with window management and event emission.
Module Declaration & Import Updates
lib.rs, tcp_ipc.rs
Module declaration added for ipc_common under macOS configuration. Import path in tcp_ipc.rs updated from crate::ipc to crate::ipc_common.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~8 minutes

Possibly related PRs

Poem

🐰 A little hop and a skip, I see,
The IPC commands now live in harmony!
Shared wisdom in ipc_common so fine,
No more duplication—just code that's divine! 🎯

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 33.33% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title accurately describes the main objective: extracting IPC types to a shared module to resolve Windows compatibility issues.

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

✨ Finishing Touches
  • 📝 Generate docstrings (stacked PR)
  • 📝 Generate docstrings (commit on current branch)
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch fix/windows-build

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.

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🧹 Nitpick comments (1)
apps/tauri/src-tauri/src/ipc_common.rs (1)

8-9: #[serde(default)] on Option<String> is redundant.

Serde already deserializes a missing JSON field as None for any Option<T> without needing the attribute. The annotation is harmless but adds noise.

♻️ Suggested cleanup
- #[serde(default)]
pub path: Option<String>,
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@apps/tauri/src-tauri/src/ipc_common.rs` around lines 8 - 9, The
#[serde(default)] attribute on the struct field `path: Option<String>` is
redundant; remove the #[serde(default)] attribute applied to `path` (the
`Option<String>` field) so Serde will naturally treat a missing field as
None—update the declaration that contains `path` to simply be `pub path:
Option<String>` and ensure no other serde attributes are needed for that field.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@apps/tauri/src-tauri/src/ipc_common.rs`:
- Around line 25-27: std::fs::canonicalize produces Windows extended-length
paths prefixed with "\\?\" which breaks downstream consumers (e.g., Node.js);
update the canonicalization in ipc_common.rs where canonicalize(&path) and
path_str are produced to remove the "\\?\" prefix on Windows (e.g., check if
path_str starts with r"\\?\" and strip that prefix) or replace the call with
dunce::canonicalize (add dunce = "1" to Cargo.toml) so the returned path string
is safe for the frontend "open-file" handler; ensure the adjusted path_str is
used in the existing code paths that emit the IPC event.
---
Nitpick comments:
In `@apps/tauri/src-tauri/src/ipc_common.rs`:
- Around line 8-9: The #[serde(default)] attribute on the struct field `path:
Option<String>` is redundant; remove the #[serde(default)] attribute applied to
`path` (the `Option<String>` field) so Serde will naturally treat a missing
field as None—update the declaration that contains `path` to simply be `pub
path: Option<String>` and ensure no other serde attributes are needed for that
field.

ℹ️ Review info

Configuration used: defaults

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 31f187b and 5e7824c.

📒 Files selected for processing (4)
  • apps/tauri/src-tauri/src/ipc.rs
  • apps/tauri/src-tauri/src/ipc_common.rs
  • apps/tauri/src-tauri/src/lib.rs
  • apps/tauri/src-tauri/src/tcp_ipc.rs

Comment on lines +25 to +27
match std::fs::canonicalize(&path) {
Ok(abs_path) => {
let path_str = abs_path.to_string_lossy().to_string();

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

std::fs::canonicalize emits \\?\-prefixed UNC paths on Windows.

On Windows, canonicalize converts the path to use extended-length path syntax (\\?\...), which may be incompatible with other applications. Node.js crashes when given such a \\?\-prefixed UNC path, meaning the frontend "open-file" event handler will receive a broken path string on Windows — the primary platform this PR adds support for.

Consider stripping the prefix after canonicalization, or using the dunce crate, which is frequently used as a wrapper over std::fs::canonicalize to strip the \\?\ prefix.

🛡️ Suggested fix (manual prefix strip, no extra dep)
- Ok(abs_path) => {- let path_str = abs_path.to_string_lossy().to_string();+ Ok(abs_path) => {+ // Strip Windows extended-length prefix so the frontend+ // receives a plain path like C:\... instead of \\?\C:\...+ let path_str = abs_path.to_string_lossy()+ .strip_prefix(r"\\?\")+ .map(str::to_string)+ .unwrap_or_else(|| abs_path.to_string_lossy().to_string());

Alternatively, add dunce = "1" to Cargo.toml and use:

let abs_path = dunce::canonicalize(&path).map_err(...)?;
📝 Committable suggestion

‼️IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
match std::fs::canonicalize(&path){
Ok(abs_path) => {
let path_str = abs_path.to_string_lossy().to_string();
match std::fs::canonicalize(&path){
Ok(abs_path) => {
// Strip Windows extended-length prefix so the frontend
// receives a plain path like C:\... instead of \\?\C:\...
let path_str = abs_path.to_string_lossy()
.strip_prefix(r"\\?\")
.map(str::to_string)
.unwrap_or_else(|| abs_path.to_string_lossy().to_string());
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@apps/tauri/src-tauri/src/ipc_common.rs` around lines 25 - 27,
std::fs::canonicalize produces Windows extended-length paths prefixed with
"\\?\" which breaks downstream consumers (e.g., Node.js); update the
canonicalization in ipc_common.rs where canonicalize(&path) and path_str are
produced to remove the "\\?\" prefix on Windows (e.g., check if path_str starts
with r"\\?\" and strip that prefix) or replace the call with dunce::canonicalize
(add dunce = "1" to Cargo.toml) so the returned path string is safe for the
frontend "open-file" handler; ensure the adjusted path_str is used in the
existing code paths that emit the IPC event.

@wilcorrea
wilcorrea merged commit 711222c into mainFeb 23, 2026
1 check passed
@wilcorrea
wilcorrea deleted the fix/windows-build branch February 23, 2026 21:44
Sign up for freeto 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.

1 participant

@wilcorrea
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(tauri): Extract IPC types to shared module for Windows compatibility - #16

Merged
wilcorrea merged 1 commit into
mainfrom
fix/windows-build
Feb 23, 2026
Merged

fix(tauri): Extract IPC types to shared module for Windows compatibility#16
wilcorrea merged 1 commit into
mainfrom
fix/windows-build

Conversation

@wilcorrea

@wilcorreawilcorrea commented Feb 23, 2026

Copy link
Copy Markdown
Contributor

Summary

Fixes the Windows build failure in release v0.5.1.

The Windows build was failing with:

error[E0432]: unresolved import `crate::ipc`
error: could not compile `arandu` (lib) due to 1 previous error

Root Cause

The tcp_ipc module was trying to import types from the ipc module, which is Unix-only (#[cfg(unix)]). On Windows, this module doesn't exist, causing the import to fail.

Solution

  • Created ipc_common.rs module with shared types and logic:
    • IpcCommand struct
    • IpcResponse struct
    • process_command() function
  • This module compiles on all platforms (no cfg restrictions)
  • Both ipc.rs (Unix socket) and tcp_ipc.rs (TCP) now import from ipc_common
  • Removed duplicate code from ipc.rs

Test Plan

  • ✅ Verified compilation on macOS: cargo check
  • Verify Windows build succeeds in CI
  • Verify Linux builds succeed in CI
  • Verify macOS builds succeed in CI
  • Check that release v0.5.1 completes successfully

Related

Summary by CodeRabbit

  • Chores
    • Reorganized internal IPC command handling to consolidate shared functionality into a common module for improved code reusability and maintainability.

The Windows build was failing because tcp_ipc was trying to import types
from the ipc module, which is Unix-only (#[cfg(unix)]). This caused:
error[E0432]: unresolved import `crate::ipc`
Solution:
- Created ipc_common.rs with IpcCommand, IpcResponse, and process_command
- This module compiles on all platforms (no cfg restrictions)
- Both ipc.rs (Unix socket) and tcp_ipc.rs (TCP) now import from ipc_common
- Removed duplicate code from ipc.rs
This fixes the Windows release build failure in v0.5.1.
@coderabbitai

coderabbitaiBot commented Feb 23, 2026

Copy link
Copy Markdown
📝 Walkthrough

Walkthrough

Extract and consolidate IPC command types and processing logic into a shared ipc_common module. Public types IpcCommand and IpcResponse, along with process_command function, are moved from ipc.rs to the new module. ipc.rs and tcp_ipc.rs updated to import from shared definitions.

Changes

Cohort / File(s)Summary
Code Reorganization
ipc.rs
Removed local definitions of IpcCommand, IpcResponse types and process_command function; added imports from shared ipc_common module. Handle client flow remains unchanged, now delegating to shared command processor.
Shared IPC Module
ipc_common.rs
New module containing IpcCommand (with deserialize support), IpcResponse (with serialize support), and process_command function. Handles "open", "ping", "show" commands with window management and event emission.
Module Declaration & Import Updates
lib.rs, tcp_ipc.rs
Module declaration added for ipc_common under macOS configuration. Import path in tcp_ipc.rs updated from crate::ipc to crate::ipc_common.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~8 minutes

Possibly related PRs

Poem

🐰 A little hop and a skip, I see,
The IPC commands now live in harmony!
Shared wisdom in ipc_common so fine,
No more duplication—just code that's divine! 🎯

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 33.33% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title accurately describes the main objective: extracting IPC types to a shared module to resolve Windows compatibility issues.

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

✨ Finishing Touches
  • 📝 Generate docstrings (stacked PR)
  • 📝 Generate docstrings (commit on current branch)
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch fix/windows-build

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.

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🧹 Nitpick comments (1)
apps/tauri/src-tauri/src/ipc_common.rs (1)

8-9: #[serde(default)] on Option<String> is redundant.

Serde already deserializes a missing JSON field as None for any Option<T> without needing the attribute. The annotation is harmless but adds noise.

♻️ Suggested cleanup
- #[serde(default)]
pub path: Option<String>,
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@apps/tauri/src-tauri/src/ipc_common.rs` around lines 8 - 9, The
#[serde(default)] attribute on the struct field `path: Option<String>` is
redundant; remove the #[serde(default)] attribute applied to `path` (the
`Option<String>` field) so Serde will naturally treat a missing field as
None—update the declaration that contains `path` to simply be `pub path:
Option<String>` and ensure no other serde attributes are needed for that field.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@apps/tauri/src-tauri/src/ipc_common.rs`:
- Around line 25-27: std::fs::canonicalize produces Windows extended-length
paths prefixed with "\\?\" which breaks downstream consumers (e.g., Node.js);
update the canonicalization in ipc_common.rs where canonicalize(&path) and
path_str are produced to remove the "\\?\" prefix on Windows (e.g., check if
path_str starts with r"\\?\" and strip that prefix) or replace the call with
dunce::canonicalize (add dunce = "1" to Cargo.toml) so the returned path string
is safe for the frontend "open-file" handler; ensure the adjusted path_str is
used in the existing code paths that emit the IPC event.
---
Nitpick comments:
In `@apps/tauri/src-tauri/src/ipc_common.rs`:
- Around line 8-9: The #[serde(default)] attribute on the struct field `path:
Option<String>` is redundant; remove the #[serde(default)] attribute applied to
`path` (the `Option<String>` field) so Serde will naturally treat a missing
field as None—update the declaration that contains `path` to simply be `pub
path: Option<String>` and ensure no other serde attributes are needed for that
field.

ℹ️ Review info

Configuration used: defaults

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 31f187b and 5e7824c.

📒 Files selected for processing (4)
  • apps/tauri/src-tauri/src/ipc.rs
  • apps/tauri/src-tauri/src/ipc_common.rs
  • apps/tauri/src-tauri/src/lib.rs
  • apps/tauri/src-tauri/src/tcp_ipc.rs

Comment on lines +25 to +27
match std::fs::canonicalize(&path) {
Ok(abs_path) => {
let path_str = abs_path.to_string_lossy().to_string();

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

std::fs::canonicalize emits \\?\-prefixed UNC paths on Windows.

On Windows, canonicalize converts the path to use extended-length path syntax (\\?\...), which may be incompatible with other applications. Node.js crashes when given such a \\?\-prefixed UNC path, meaning the frontend "open-file" event handler will receive a broken path string on Windows — the primary platform this PR adds support for.

Consider stripping the prefix after canonicalization, or using the dunce crate, which is frequently used as a wrapper over std::fs::canonicalize to strip the \\?\ prefix.

🛡️ Suggested fix (manual prefix strip, no extra dep)
- Ok(abs_path) => {- let path_str = abs_path.to_string_lossy().to_string();+ Ok(abs_path) => {+ // Strip Windows extended-length prefix so the frontend+ // receives a plain path like C:\... instead of \\?\C:\...+ let path_str = abs_path.to_string_lossy()+ .strip_prefix(r"\\?\")+ .map(str::to_string)+ .unwrap_or_else(|| abs_path.to_string_lossy().to_string());

Alternatively, add dunce = "1" to Cargo.toml and use:

let abs_path = dunce::canonicalize(&path).map_err(...)?;
📝 Committable suggestion

‼️IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
match std::fs::canonicalize(&path){
Ok(abs_path) => {
let path_str = abs_path.to_string_lossy().to_string();
match std::fs::canonicalize(&path){
Ok(abs_path) => {
// Strip Windows extended-length prefix so the frontend
// receives a plain path like C:\... instead of \\?\C:\...
let path_str = abs_path.to_string_lossy()
.strip_prefix(r"\\?\")
.map(str::to_string)
.unwrap_or_else(|| abs_path.to_string_lossy().to_string());
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@apps/tauri/src-tauri/src/ipc_common.rs` around lines 25 - 27,
std::fs::canonicalize produces Windows extended-length paths prefixed with
"\\?\" which breaks downstream consumers (e.g., Node.js); update the
canonicalization in ipc_common.rs where canonicalize(&path) and path_str are
produced to remove the "\\?\" prefix on Windows (e.g., check if path_str starts
with r"\\?\" and strip that prefix) or replace the call with dunce::canonicalize
(add dunce = "1" to Cargo.toml) so the returned path string is safe for the
frontend "open-file" handler; ensure the adjusted path_str is used in the
existing code paths that emit the IPC event.

@wilcorrea
wilcorrea merged commit 711222c into mainFeb 23, 2026
1 check passed
@wilcorrea
wilcorrea deleted the fix/windows-build branch February 23, 2026 21:44
Sign up for freeto 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.

1 participant

@wilcorrea
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(tauri): Extract IPC types to shared module for Windows compatibility - #16

Merged
wilcorrea merged 1 commit into
mainfrom
fix/windows-build
Feb 23, 2026
Merged

fix(tauri): Extract IPC types to shared module for Windows compatibility#16
wilcorrea merged 1 commit into
mainfrom
fix/windows-build

Conversation

@wilcorrea

@wilcorreawilcorrea commented Feb 23, 2026

Copy link
Copy Markdown
Contributor

Summary

Fixes the Windows build failure in release v0.5.1.

The Windows build was failing with:

error[E0432]: unresolved import `crate::ipc`
error: could not compile `arandu` (lib) due to 1 previous error

Root Cause

The tcp_ipc module was trying to import types from the ipc module, which is Unix-only (#[cfg(unix)]). On Windows, this module doesn't exist, causing the import to fail.

Solution

  • Created ipc_common.rs module with shared types and logic:
    • IpcCommand struct
    • IpcResponse struct
    • process_command() function
  • This module compiles on all platforms (no cfg restrictions)
  • Both ipc.rs (Unix socket) and tcp_ipc.rs (TCP) now import from ipc_common
  • Removed duplicate code from ipc.rs

Test Plan

  • ✅ Verified compilation on macOS: cargo check
  • Verify Windows build succeeds in CI
  • Verify Linux builds succeed in CI
  • Verify macOS builds succeed in CI
  • Check that release v0.5.1 completes successfully

Related

Summary by CodeRabbit

  • Chores
    • Reorganized internal IPC command handling to consolidate shared functionality into a common module for improved code reusability and maintainability.

The Windows build was failing because tcp_ipc was trying to import types
from the ipc module, which is Unix-only (#[cfg(unix)]). This caused:
error[E0432]: unresolved import `crate::ipc`
Solution:
- Created ipc_common.rs with IpcCommand, IpcResponse, and process_command
- This module compiles on all platforms (no cfg restrictions)
- Both ipc.rs (Unix socket) and tcp_ipc.rs (TCP) now import from ipc_common
- Removed duplicate code from ipc.rs
This fixes the Windows release build failure in v0.5.1.
@coderabbitai

coderabbitaiBot commented Feb 23, 2026

Copy link
Copy Markdown
📝 Walkthrough

Walkthrough

Extract and consolidate IPC command types and processing logic into a shared ipc_common module. Public types IpcCommand and IpcResponse, along with process_command function, are moved from ipc.rs to the new module. ipc.rs and tcp_ipc.rs updated to import from shared definitions.

Changes

Cohort / File(s)Summary
Code Reorganization
ipc.rs
Removed local definitions of IpcCommand, IpcResponse types and process_command function; added imports from shared ipc_common module. Handle client flow remains unchanged, now delegating to shared command processor.
Shared IPC Module
ipc_common.rs
New module containing IpcCommand (with deserialize support), IpcResponse (with serialize support), and process_command function. Handles "open", "ping", "show" commands with window management and event emission.
Module Declaration & Import Updates
lib.rs, tcp_ipc.rs
Module declaration added for ipc_common under macOS configuration. Import path in tcp_ipc.rs updated from crate::ipc to crate::ipc_common.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~8 minutes

Possibly related PRs

Poem

🐰 A little hop and a skip, I see,
The IPC commands now live in harmony!
Shared wisdom in ipc_common so fine,
No more duplication—just code that's divine! 🎯

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 33.33% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title accurately describes the main objective: extracting IPC types to a shared module to resolve Windows compatibility issues.

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

✨ Finishing Touches
  • 📝 Generate docstrings (stacked PR)
  • 📝 Generate docstrings (commit on current branch)
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch fix/windows-build

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.

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🧹 Nitpick comments (1)
apps/tauri/src-tauri/src/ipc_common.rs (1)

8-9: #[serde(default)] on Option<String> is redundant.

Serde already deserializes a missing JSON field as None for any Option<T> without needing the attribute. The annotation is harmless but adds noise.

♻️ Suggested cleanup
- #[serde(default)]
pub path: Option<String>,
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@apps/tauri/src-tauri/src/ipc_common.rs` around lines 8 - 9, The
#[serde(default)] attribute on the struct field `path: Option<String>` is
redundant; remove the #[serde(default)] attribute applied to `path` (the
`Option<String>` field) so Serde will naturally treat a missing field as
None—update the declaration that contains `path` to simply be `pub path:
Option<String>` and ensure no other serde attributes are needed for that field.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@apps/tauri/src-tauri/src/ipc_common.rs`:
- Around line 25-27: std::fs::canonicalize produces Windows extended-length
paths prefixed with "\\?\" which breaks downstream consumers (e.g., Node.js);
update the canonicalization in ipc_common.rs where canonicalize(&path) and
path_str are produced to remove the "\\?\" prefix on Windows (e.g., check if
path_str starts with r"\\?\" and strip that prefix) or replace the call with
dunce::canonicalize (add dunce = "1" to Cargo.toml) so the returned path string
is safe for the frontend "open-file" handler; ensure the adjusted path_str is
used in the existing code paths that emit the IPC event.
---
Nitpick comments:
In `@apps/tauri/src-tauri/src/ipc_common.rs`:
- Around line 8-9: The #[serde(default)] attribute on the struct field `path:
Option<String>` is redundant; remove the #[serde(default)] attribute applied to
`path` (the `Option<String>` field) so Serde will naturally treat a missing
field as None—update the declaration that contains `path` to simply be `pub
path: Option<String>` and ensure no other serde attributes are needed for that
field.

ℹ️ Review info

Configuration used: defaults

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 31f187b and 5e7824c.

📒 Files selected for processing (4)
  • apps/tauri/src-tauri/src/ipc.rs
  • apps/tauri/src-tauri/src/ipc_common.rs
  • apps/tauri/src-tauri/src/lib.rs
  • apps/tauri/src-tauri/src/tcp_ipc.rs

Comment on lines +25 to +27
match std::fs::canonicalize(&path) {
Ok(abs_path) => {
let path_str = abs_path.to_string_lossy().to_string();

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

std::fs::canonicalize emits \\?\-prefixed UNC paths on Windows.

On Windows, canonicalize converts the path to use extended-length path syntax (\\?\...), which may be incompatible with other applications. Node.js crashes when given such a \\?\-prefixed UNC path, meaning the frontend "open-file" event handler will receive a broken path string on Windows — the primary platform this PR adds support for.

Consider stripping the prefix after canonicalization, or using the dunce crate, which is frequently used as a wrapper over std::fs::canonicalize to strip the \\?\ prefix.

🛡️ Suggested fix (manual prefix strip, no extra dep)
- Ok(abs_path) => {- let path_str = abs_path.to_string_lossy().to_string();+ Ok(abs_path) => {+ // Strip Windows extended-length prefix so the frontend+ // receives a plain path like C:\... instead of \\?\C:\...+ let path_str = abs_path.to_string_lossy()+ .strip_prefix(r"\\?\")+ .map(str::to_string)+ .unwrap_or_else(|| abs_path.to_string_lossy().to_string());

Alternatively, add dunce = "1" to Cargo.toml and use:

let abs_path = dunce::canonicalize(&path).map_err(...)?;
📝 Committable suggestion

‼️IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
match std::fs::canonicalize(&path){
Ok(abs_path) => {
let path_str = abs_path.to_string_lossy().to_string();
match std::fs::canonicalize(&path){
Ok(abs_path) => {
// Strip Windows extended-length prefix so the frontend
// receives a plain path like C:\... instead of \\?\C:\...
let path_str = abs_path.to_string_lossy()
.strip_prefix(r"\\?\")
.map(str::to_string)
.unwrap_or_else(|| abs_path.to_string_lossy().to_string());
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@apps/tauri/src-tauri/src/ipc_common.rs` around lines 25 - 27,
std::fs::canonicalize produces Windows extended-length paths prefixed with
"\\?\" which breaks downstream consumers (e.g., Node.js); update the
canonicalization in ipc_common.rs where canonicalize(&path) and path_str are
produced to remove the "\\?\" prefix on Windows (e.g., check if path_str starts
with r"\\?\" and strip that prefix) or replace the call with dunce::canonicalize
(add dunce = "1" to Cargo.toml) so the returned path string is safe for the
frontend "open-file" handler; ensure the adjusted path_str is used in the
existing code paths that emit the IPC event.

@wilcorrea
wilcorrea merged commit 711222c into mainFeb 23, 2026
1 check passed
@wilcorrea
wilcorrea deleted the fix/windows-build branch February 23, 2026 21:44
Sign up for freeto 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.

1 participant

@wilcorrea
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

fix(tauri): Extract IPC types to shared module for Windows compatibility - #16

Merged
wilcorrea merged 1 commit into
mainfrom
fix/windows-build
Feb 23, 2026
Merged

fix(tauri): Extract IPC types to shared module for Windows compatibility#16
wilcorrea merged 1 commit into
mainfrom
fix/windows-build

Conversation

@wilcorrea

@wilcorreawilcorrea commented Feb 23, 2026

Copy link
Copy Markdown
Contributor

Summary

Fixes the Windows build failure in release v0.5.1.

The Windows build was failing with:

error[E0432]: unresolved import `crate::ipc`
error: could not compile `arandu` (lib) due to 1 previous error

Root Cause

The tcp_ipc module was trying to import types from the ipc module, which is Unix-only (#[cfg(unix)]). On Windows, this module doesn't exist, causing the import to fail.

Solution

  • Created ipc_common.rs module with shared types and logic:
    • IpcCommand struct
    • IpcResponse struct
    • process_command() function
  • This module compiles on all platforms (no cfg restrictions)
  • Both ipc.rs (Unix socket) and tcp_ipc.rs (TCP) now import from ipc_common
  • Removed duplicate code from ipc.rs

Test Plan

  • ✅ Verified compilation on macOS: cargo check
  • Verify Windows build succeeds in CI
  • Verify Linux builds succeed in CI
  • Verify macOS builds succeed in CI
  • Check that release v0.5.1 completes successfully

Related

Summary by CodeRabbit

  • Chores
    • Reorganized internal IPC command handling to consolidate shared functionality into a common module for improved code reusability and maintainability.

The Windows build was failing because tcp_ipc was trying to import types
from the ipc module, which is Unix-only (#[cfg(unix)]). This caused:
error[E0432]: unresolved import `crate::ipc`
Solution:
- Created ipc_common.rs with IpcCommand, IpcResponse, and process_command
- This module compiles on all platforms (no cfg restrictions)
- Both ipc.rs (Unix socket) and tcp_ipc.rs (TCP) now import from ipc_common
- Removed duplicate code from ipc.rs
This fixes the Windows release build failure in v0.5.1.
@coderabbitai

coderabbitaiBot commented Feb 23, 2026

Copy link
Copy Markdown
📝 Walkthrough

Walkthrough

Extract and consolidate IPC command types and processing logic into a shared ipc_common module. Public types IpcCommand and IpcResponse, along with process_command function, are moved from ipc.rs to the new module. ipc.rs and tcp_ipc.rs updated to import from shared definitions.

Changes

Cohort / File(s)Summary
Code Reorganization
ipc.rs
Removed local definitions of IpcCommand, IpcResponse types and process_command function; added imports from shared ipc_common module. Handle client flow remains unchanged, now delegating to shared command processor.
Shared IPC Module
ipc_common.rs
New module containing IpcCommand (with deserialize support), IpcResponse (with serialize support), and process_command function. Handles "open", "ping", "show" commands with window management and event emission.
Module Declaration & Import Updates
lib.rs, tcp_ipc.rs
Module declaration added for ipc_common under macOS configuration. Import path in tcp_ipc.rs updated from crate::ipc to crate::ipc_common.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~8 minutes

Possibly related PRs

Poem

🐰 A little hop and a skip, I see,
The IPC commands now live in harmony!
Shared wisdom in ipc_common so fine,
No more duplication—just code that's divine! 🎯

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 33.33% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title accurately describes the main objective: extracting IPC types to a shared module to resolve Windows compatibility issues.

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

✨ Finishing Touches
  • 📝 Generate docstrings (stacked PR)
  • 📝 Generate docstrings (commit on current branch)
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch fix/windows-build

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.

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🧹 Nitpick comments (1)
apps/tauri/src-tauri/src/ipc_common.rs (1)

8-9: #[serde(default)] on Option<String> is redundant.

Serde already deserializes a missing JSON field as None for any Option<T> without needing the attribute. The annotation is harmless but adds noise.

♻️ Suggested cleanup
- #[serde(default)]
pub path: Option<String>,
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@apps/tauri/src-tauri/src/ipc_common.rs` around lines 8 - 9, The
#[serde(default)] attribute on the struct field `path: Option<String>` is
redundant; remove the #[serde(default)] attribute applied to `path` (the
`Option<String>` field) so Serde will naturally treat a missing field as
None—update the declaration that contains `path` to simply be `pub path:
Option<String>` and ensure no other serde attributes are needed for that field.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@apps/tauri/src-tauri/src/ipc_common.rs`:
- Around line 25-27: std::fs::canonicalize produces Windows extended-length
paths prefixed with "\\?\" which breaks downstream consumers (e.g., Node.js);
update the canonicalization in ipc_common.rs where canonicalize(&path) and
path_str are produced to remove the "\\?\" prefix on Windows (e.g., check if
path_str starts with r"\\?\" and strip that prefix) or replace the call with
dunce::canonicalize (add dunce = "1" to Cargo.toml) so the returned path string
is safe for the frontend "open-file" handler; ensure the adjusted path_str is
used in the existing code paths that emit the IPC event.
---
Nitpick comments:
In `@apps/tauri/src-tauri/src/ipc_common.rs`:
- Around line 8-9: The #[serde(default)] attribute on the struct field `path:
Option<String>` is redundant; remove the #[serde(default)] attribute applied to
`path` (the `Option<String>` field) so Serde will naturally treat a missing
field as None—update the declaration that contains `path` to simply be `pub
path: Option<String>` and ensure no other serde attributes are needed for that
field.

ℹ️ Review info

Configuration used: defaults

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 31f187b and 5e7824c.

📒 Files selected for processing (4)
  • apps/tauri/src-tauri/src/ipc.rs
  • apps/tauri/src-tauri/src/ipc_common.rs
  • apps/tauri/src-tauri/src/lib.rs
  • apps/tauri/src-tauri/src/tcp_ipc.rs

Comment on lines +25 to +27
match std::fs::canonicalize(&path) {
Ok(abs_path) => {
let path_str = abs_path.to_string_lossy().to_string();

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

std::fs::canonicalize emits \\?\-prefixed UNC paths on Windows.

On Windows, canonicalize converts the path to use extended-length path syntax (\\?\...), which may be incompatible with other applications. Node.js crashes when given such a \\?\-prefixed UNC path, meaning the frontend "open-file" event handler will receive a broken path string on Windows — the primary platform this PR adds support for.

Consider stripping the prefix after canonicalization, or using the dunce crate, which is frequently used as a wrapper over std::fs::canonicalize to strip the \\?\ prefix.

🛡️ Suggested fix (manual prefix strip, no extra dep)
- Ok(abs_path) => {- let path_str = abs_path.to_string_lossy().to_string();+ Ok(abs_path) => {+ // Strip Windows extended-length prefix so the frontend+ // receives a plain path like C:\... instead of \\?\C:\...+ let path_str = abs_path.to_string_lossy()+ .strip_prefix(r"\\?\")+ .map(str::to_string)+ .unwrap_or_else(|| abs_path.to_string_lossy().to_string());

Alternatively, add dunce = "1" to Cargo.toml and use:

let abs_path = dunce::canonicalize(&path).map_err(...)?;
📝 Committable suggestion

‼️IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
match std::fs::canonicalize(&path){
Ok(abs_path) => {
let path_str = abs_path.to_string_lossy().to_string();
match std::fs::canonicalize(&path){
Ok(abs_path) => {
// Strip Windows extended-length prefix so the frontend
// receives a plain path like C:\... instead of \\?\C:\...
let path_str = abs_path.to_string_lossy()
.strip_prefix(r"\\?\")
.map(str::to_string)
.unwrap_or_else(|| abs_path.to_string_lossy().to_string());
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@apps/tauri/src-tauri/src/ipc_common.rs` around lines 25 - 27,
std::fs::canonicalize produces Windows extended-length paths prefixed with
"\\?\" which breaks downstream consumers (e.g., Node.js); update the
canonicalization in ipc_common.rs where canonicalize(&path) and path_str are
produced to remove the "\\?\" prefix on Windows (e.g., check if path_str starts
with r"\\?\" and strip that prefix) or replace the call with dunce::canonicalize
(add dunce = "1" to Cargo.toml) so the returned path string is safe for the
frontend "open-file" handler; ensure the adjusted path_str is used in the
existing code paths that emit the IPC event.

@wilcorrea
wilcorrea merged commit 711222c into mainFeb 23, 2026
1 check passed
@wilcorrea
wilcorrea deleted the fix/windows-build branch February 23, 2026 21:44
Sign up for freeto 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.

1 participant

@wilcorrea