rust-port
Port code from C, C++, Python, Go, JavaScript, or TypeScript into idiomatic Rust that keeps the original behavior: ownership instead of manual memory, Result instead of error codes and exceptions, enums instead of flag ints and magic strings, and tests that prove the port matches.
Install / Use
npx skills add morganlinton/BeautifulRust --skill rust-portInstalls into whichever agent you are using.
SKILL.md
Installable skill definition
Quality Score
Category
Development & EngineeringSupported Platforms
Our assessment of rust-port
rust-port scores 89/100 on our quality scale, 1648th of 4,645 Development & Engineering skills we index (top 36%).
Its SKILL.md is 8.1 KB long, well organised into 10 sections with 1 code example: a thorough specification that gives an agent plenty to work with.
With 1,611 GitHub stars, it is one of the more widely adopted skills in the catalogue.
Maintenance, license and trust
- The repository was last updated 7 days ago, so rust-port is actively maintained.
- It is released under the MIT license, a permissive license that allows use, modification and commercial use with attribution.
- Its trust signals score 100/100, with no cautions. These come from repository metadata, not a code audit — read the skill file before letting an agent act on it.
Safety scan
No issues foundOur scan of the whole file found no instruction hijacking, hidden characters, credential access, data exfiltration or destructive commands.
Automated pattern scan on 2026-11-07. It catches known dangerous patterns, not every risk — read a skill before letting an agent act on it.
rust-port compared with similar skills
All 4 of these similar skills score higher than rust-port; compare them before choosing.
| Skill | Score | Stars | Updated | Format |
|---|---|---|---|---|
| rust-port (this skill)by morganlinton | 89 | 1.6k | 7d ago | SKILL.md |
| taste-skillby Leonxlnx | 100 | 111.4k | 2d ago | CLAUDE.md |
| Agent-Reachby Panniantong | 100 | 109.8k | 1d ago | CLAUDE.md |
| headroomby headroomlabs-ai | 100 | 79.1k | today | CLAUDE.md |
| ai-job-searchby ai-job-search-dev | 100 | 70.2k | 2d ago | CLAUDE.md |
Frequently asked questions
- How do I install rust-port?
- Run
npx skills add morganlinton/BeautifulRust --skill rust-port. The install tabs above show the steps for each supported agent. - Which AI agents does rust-port work with?
- It is written for Universal, as a SKILL.md file. Other agents that read the same format can often use it too.
- Is rust-port safe to use?
- Our scan of the whole file found no instruction hijacking, hidden characters, credential access, data exfiltration or destructive commands. It is MIT-licensed and scores 100/100 on trust signals. Skills are instructions an agent will follow, so read the file before installing it and do not approve commands you do not understand.
- Is rust-port still maintained?
- The repository was last updated 7 days ago, so rust-port is actively maintained.
Skill content
View source on GitHubname: rust-port description: >- Port code from C, C++, Python, Go, JavaScript, or TypeScript into idiomatic Rust that keeps the original behavior: ownership instead of manual memory, Result instead of error codes and exceptions, enums instead of flag ints and magic strings, and tests that prove the port matches. Use this whenever the user asks to port, translate, convert, migrate, or rewrite code in Rust ("rewrite this in Rust", "what would this look like in Rust", "move this module to Rust"), even if they don't say "port". Pairs with the rust-best-practices skill, which covers the target code's style.
Rust port
The goal is the Rust a Rust developer would have written to solve the same problem, with
the same observable behavior. A line-by-line transliteration (C written in Rust syntax,
or Python with Box<dyn Any>) compiles but keeps every problem the original had and adds
the borrow checker on top. Port the behavior, not the structure.
1. Understand the original before writing anything
- Read the code and its tests, and anything that calls it, if you have it.
- List the observable behavior: every public function, its inputs, its outputs, and every way it can fail. Include the quiet parts, which are where ports go wrong: ordering of results, how ties break, what happens on empty input, whitespace and case handling, integer limits, and what counts as an error versus a valid edge case.
- Note what is incidental, meaning things the original only does because of its
language: manual memory management, out-parameters,
NULLreturns, global state, fixed-size buffers, a class that exists only to group functions, orisinstancechecks. These don't carry over. - If the original has a bug or an ambiguity, keep its behavior, flag it in the porting notes, and let the user decide. A port is not the place to silently fix things.
2. Port the tests first
Translate the original tests into Rust tests before porting the implementation. Keep one Rust test per original test, with a name that maps back to it, so a reader can check coverage. The tests are the definition of "same behavior". If the original has no tests, write characterization tests from the behavior list in step 1.
3. Design the Rust API, then implement it
Decide the public types and signatures from the behavior list, not from the original's shape. Then implement against the ported tests.
From C and C++
| In the original | In Rust |
|---|---|
| malloc/free, new/delete, create/destroy pairs | Owned types (String, Vec, Box) dropped automatically; Drop for anything else |
| NULL meaning "absent" | Option<T> |
| Error codes (-1, ERR_* defines), errno | Result<T, E> with an error enum, one variant per code, implementing Display and std::error::Error |
| Out-parameters (int *err_line, long *out) | Return values: put the data in the Ok value or the error variant |
| Flag bitmasks (FLAG_A \| FLAG_B) | An options struct with named fields and Default, or the bitflags crate; never a raw u32 |
| char * plus length, strcmp, strcasecmp | &str/String, ==, eq_ignore_ascii_case |
| Pointer plus count, iterator by index | Slices, iterators |
| Fixed-size buffers and their truncation | Growable types; drop the limit unless the limit is behavior |
| #define constants and macros | const, enums, and functions |
| Global or static mutable state | A struct the caller owns |
| strtol and friends | str::parse with the matching integer type; map parse failures to your error enum |
Don't write unsafe or use raw pointers unless the port must talk to C through FFI, and
then confine it as the rust-best-practices skill describes.
From Python
| In the original | In Rust |
|---|---|
| An exception hierarchy | One error enum (or one per area) with a variant per exception class; data attributes become variant fields |
| None as a value | Option<T> |
| Strings used as a closed set (kind in ("build", "test")) | An enum, with FromStr and Display for the text form |
| Dicts or classes used as records | Structs with named fields |
| dict iteration order (insertion order is guaranteed) | Vec or an ordered map when order is observable; a plain HashMap silently changes output order |
| Duck typing, isinstance | Traits or enums |
| Unbounded int | A sized integer chosen on purpose, with overflow handled (checked_*) where input can be large |
| sorted(..., key=...) | sort_by_key or sort_by; both are stable, like Python's |
| str.splitlines(), strip(), isalnum() | lines(), trim(), char::is_alphanumeric; check edge cases such as \r\n, Unicode, and empty strings against the original |
| try/except around a parse | ? with a mapped error, or match on the Result |
From Go, JavaScript, and TypeScript
- Go
(value, error)returns becomeResult;nilbecomesOption; interfaces become traits; goroutines and channels become threads withstd::sync::mpscor async tasks, depending on what the original needs. - JavaScript
nullandundefinedbecomeOption; thrown errors becomeResult; plain objects become structs; numbers become a sized integer orf64, chosen on purpose.
4. Keep the port proportionate
A port that matches the original on every possible input is usually the wrong goal. Match it on the inputs it actually receives, and use Rust's standard library for the rest.
- Don't reimplement the source language's runtime. Use
str::lines,str::trim,str::parse, andcharmethods, not hand-written copies of Python'ssplitlines,strip,int(), orrepr(), or of C's locale-dependentisspaceandstrtol. Where Rust's behavior differs only on exotic input, such as Unicode digits, non-ASCII whitespace, or unbounded integers, list the difference in the porting notes instead of coding around it. Write a compatibility shim only when the user says those inputs occur. - Don't grow the API. Port the public surface the original has, plus the standard
trait impls Rust callers expect (
Debug,Clone,Display,Error,FromStr,Default, andIntoIteratorfor collections). Skip builders,Indeximpls,FromIterator,Extend, and custom iterator types unless the original's callers need them. - Keep the algorithm unless it's wrong. Swap in a different algorithm only to fix a real problem, such as quadratic behavior on realistic input, and say so in the notes.
- Check the size. Count code lines, excluding tests, comments, and doc comments. A port from C or C++ usually lands near the original's size. A port from Python or JavaScript usually lands at two to three times the original, because types, error enums, and their trait impls are explicit in Rust. Much more than that usually means one of the three habits above.
Differential testing against the original is worth doing, but a few dozen realistic and edge-case inputs answer the question. A fuzzing harness over millions of inputs usually just finds exotic divergences that belong in the notes.
5. Verify
Run these if a Rust toolchain is available, and fix everything before reporting:
cargo build
cargo test
cargo clippy --all-targets -- -D warnings
Every ported test must pass. If the original's tests can be run too, run them and compare results on the same inputs.
6. Write the porting notes
Alongside the code, write a short PORTING.md that a reviewer can check in a few
minutes:
- API mapping: a table from each original function or type to its Rust equivalent.
- Test mapping: each original test and the Rust test that covers it.
- Deliberate differences: anything that now behaves differently and why, such as an out-of-memory error that no longer exists, a fixed buffer limit that's gone, or exotic input where Rust's standard library behaves differently from the original's.
- Preserved quirks: odd behavior kept on purpose, so nobody "fixes" it by accident.
- Verification: which commands you ran and their result, or a plain statement that you couldn't run them.
For the style of the Rust itself, follow the rust-best-practices skill if it is
installed.
Related Skills
taste-skill
111.4kAgent skills that give coding agents taste: art direction, reference images and a browser check instead of generic AI pages
Agent-Reach
109.8kGive your AI agent eyes to see the entire internet. Read & search Twitter, Reddit, YouTube, GitHub, Bilibili, XiaoHongShu — one CLI, zero API fees.
headroom
79.1kCompress tool outputs, logs, files, and RAG chunks before they reach the LLM. 20% fewer tokens for coding agents, 60-95% fewer tokens for JSON, same answers. Library, proxy, MCP server.
ai-job-search
70.2kThe job search that runs on your machine. AI job application framework built on Claude Code: evaluate postings, tailor CVs, write cover letters, prep interviews. Fork it and own it.
Languages
Trust signals
From repository metadata: license, adoption, age and documentation. Not a code audit — see the Safety scan above for what the skill file itself contains.
