Rust library for filesystems in userspace (FUSE)

Overview

Rust FUSE - Filesystem in Userspace

Crates.io Crates.io

About

fuse-rs is a Rust library crate for easy implementation of FUSE filesystems in userspace.

fuse-rs does not just provide bindings, it is a rewrite of the original FUSE C library to fully take advantage of Rust's architecture.

Documentation

Crate documentation

Details

A working FUSE filesystem consists of three parts:

  1. The kernel driver that registers as a filesystem and forwards operations into a communication channel to a userspace process that handles them.
  2. The userspace library (libfuse) that helps the userspace process to establish and run communication with the kernel driver.
  3. The userspace implementation that actually processes the filesystem operations.

The kernel driver is provided by the FUSE project, the userspace implementation needs to be provided by the developer. fuse-rs provides a replacement for the libfuse userspace library between these two. This way, a developer can fully take advantage of the Rust type interface and runtime features when building a FUSE filesystem in Rust.

Except for a single setup (mount) function call and a final teardown (unmount) function call to libfuse, everything runs in Rust.

Dependencies

FUSE must be installed to build or run programs that use fuse-rs (i.e. kernel driver and libraries. Some platforms may also require userland utils like fusermount). A default installation of FUSE is usually sufficient.

To build fuse-rs or any program that depends on it, pkg-config needs to be installed as well.

Linux

FUSE for Linux is available in most Linux distributions and usually called fuse. To install on a Debian based system:

sudo apt-get install fuse

Install on CentOS:

sudo yum install fuse

To build, FUSE libraries and headers are required. The package is usually called libfuse-dev or fuse-devel. Also pkg-config is required for locating libraries and headers.

sudo apt-get install libfuse-dev pkg-config
sudo yum install fuse-devel pkgconfig

macOS

Installer packages can be downloaded from the FUSE for macOS homepage.

To install using Homebrew:

brew cask install osxfuse

To install pkg-config (required for building only):

brew install pkg-config

FreeBSD

Install packages fusefs-libs and pkgconf.

pkg install fusefs-libs pkgconf

Usage

Put this in your Cargo.toml:

[dependencies]
fuse = "0.4"

To create a new filesystem, implement the trait fuse::Filesystem. See the documentation for details or the examples directory for some basic examples.

To Do

There's still a lot of stuff to be done. Feel free to contribute. See the list of issues on GitHub and search the source files for comments containing "TODO" or "FIXME" to see what's still missing.

Compatibility

Developed and tested on macOS. Tested under Linux, macOS and FreeBSD using stable, beta and nightly Rust versions (see CI for details).

Contribution

Fork, hack, submit pull request. Make sure to make it useful for the target audience, keep the project's philosophy and Rust coding standards in mind. For larger or essential changes, you may want to open an issue for discussion first. Also remember to update the Changelog if your changes are relevant to the users.

Comments
  • Update FUSE kernel ABI

    Update FUSE kernel ABI

    Update to use FUSE kernel ABI 7.19 which opens up the possibility to support more desired features like better optimization, ioctl and polling/notifications. This will raise the requirements to FUSE 2.9.1 or later on Linux and OSXFUSE 3.0.0 or later on macOS. There are even newer ABI versions, but 7.19 seems to be the one most commonly supported by various systems.

    enhancement compatibility 
    opened by zargony 19
  • How do I build the example?

    How do I build the example?

    cargo build produce empty target/debug/examples/ directory.

    Manual compilation also fails:

    $  rustc    -L target/debug  examples/hello.rs  
    examples/hello.rs:3:1: 3:19 error: found possibly newer version of crate `log` which `fuse` depends on
    examples/hello.rs:3 extern crate fuse;
                        ^~~~~~~~~~~~~~~~~~
    examples/hello.rs:3:1: 3:19 note: perhaps this crate needs to be recompiled?
    examples/hello.rs:3 extern crate fuse;
                        ^~~~~~~~~~~~~~~~~~
    examples/hello.rs:3:19: 3:19 note: crate `log` path #1: /home/vi/home/rust/prefix/lib/rustlib/i686-unknown-linux-gnu/lib/liblog-4e7c5e5c.rlib
    examples/hello.rs:3:19: 3:19 note: crate `log` path #2: /home/vi/home/rust/prefix/lib/rustlib/i686-unknown-linux-gnu/lib/liblog-4e7c5e5c.so
    examples/hello.rs:3:19: 3:19 note: crate `fuse` path #1: /home/vi/home/rust/rust-fuse/target/debug/libfuse-c61beed3b50079b8.rlib
    error: aborting due to previous error
    

    I think there should also be a fusexmp or bindfs-like example. This is both useful as a reference of Rust's filesytem features and as a basis for new FUSE programs.

    question 
    opened by vi 10
  • Integration tests

    Integration tests

    I've added some structure to support integration tests. Right now there are only a few, which exercise code similar to the ones in the examples directory, but the idea is to add more to cover different usage patterns that we intend to support.

    Because it's a bit more hazardous to actually mount filesystems, I figured these needed to be a different target and not part of make check.

    I tried to figure out how to actually use, rather than copy, the code in the examples dir for the integration tests, but I couldn't see how without adding integration test code to the examples themselves, which would then make the code files less useful as examples of normal use.

    Right now, the "null-example" test does not work correctly under OS X--it passes its tests, but then fails to stop its background task and gets killed by the wrapper script after timing out. This is due to #7.

    enhancement 
    opened by MicahChalmer 7
  • Allow, but not require, filesystem options running concurrently

    Allow, but not require, filesystem options running concurrently

    In reply to your comment on reddit in which you explained why you don't spawn a new task for each operation:

    First I planned to dispatch every operation into separate tasks, but then I realized that this might not be always desirable. One idea of Rust is to prevent waiting/locking at all by grouping access to one resource in a single task. Most of the filesystem operations deal with metadata that manage inodes. They could easily be done in a single task since they'd require exclusive access to these metadata anyway. Operations that deal with actual data (read/write) are candidates to be parallelized, I think. However I don't have any benchmarks on this idea yet.

    The metadata, as well as the underlying data, may live across a network somewhere, which means any operation might be both slow and parallelizeable. So I think all of operations should be able to run concurrently, not just read and write. But your point about internal inode mappings still stands, so I agree that it shouldn't force a new task for every operation.

    So here's another idea. For simplicity, let me pick readlink as the example--the signature would change from this:

    fn readlink (&mut self, _ino: u64) -> Result<~str, c_int>
    

    to this:

    fn readlink (&mut self, _ino: u64,
                 handle: ReplyHandle<Result<~str, c_int>>)
    

    (I'm not sure I like the name "ReplyHandle" but am at a loss for a better one.) You could implement it synchronously like this:

    impl FileSystem for SingleTaskFS {
        fn readlink(&mut self, ino: u64,
                    handle: ReplyHandle<Result<~str, c_int>>) {
            let s:~str = (/*get the result here...*/);
            handle.reply(Ok(s));
        }
    }
    

    or asynchronously like this:

    impl FileSystem for MultiTaskFS {
        fn readlink(&mut self, ino: u64,
                    handle: ReplyHandle<Result<~str, c_int>>) {
            do task().spawn_with(handle) |handle| {
                let s:~str = (/*get the result here...*/);
                handle.reply(Ok(s));
            }
        }
    }
    

    The reply method of the handle would take by-value self, and the handle would be sendable but not copyable. So the compiler would ensure that the operation could not reply multiple times, and that only correctly typed replies could be sent for each operation. It could not enforce at compile time that the code for the operation always explicitly provides a reply, but the handle could implement Drop so as to automatically provide an error back to FUSE if it falls out of scope when no reply was provided.

    This pattern could also allow data to be passed out of read without copying the data--the handle passed to read could take an enum with many forms, including a borrowed slice, another file descriptor, or even (unsafely) an iovec.

    I plan to try this out myself, but I'm leaving this issue here in advance, in case you had any thoughts on the general idea before I've fleshed out all the specifics.

    enhancement 
    opened by MicahChalmer 7
  • fuse_attr needs blksize

    fuse_attr needs blksize

    Current rust-fuse doesn't have blksize field in fuse_attr struct.

    Is this a bug?

    struct fuse_attr {
            __u64   ino;
            __u64   size;
            __u64   blocks;
            __u64   atime;
            __u64   mtime;
            __u64   ctime;
            __u32   atimensec;
            __u32   mtimensec;
            __u32   ctimensec;
            __u32   mode;
            __u32   nlink;
            __u32   uid;
            __u32   gid;
            __u32   rdev;
            __u32   blksize;
            __u32   padding;
    };
    
    enhancement 
    opened by akiradeveloper 6
  • Allow, but not require, concurrent filesystem operations

    Allow, but not require, concurrent filesystem operations

    This implements something close to the structures described in the comments of #1. The main difference in the filesystem operation signatures from what was discussed before is that the type parameter is on the Request, not the Reply.

    There were more changes needed to make concurrent filesystem operations actually work. Along with that I rearranged the code a bit, which I hope leaves it in a state that makes sense. It started when I needed to repurpose Request, and thus moved the dispatch fn to session (which makes more sense--it was mutating the session object anyway.) Then it seemed odd that some of the channel-handling code was in session, so I moved it to channel with the rest of it.

    I split this into two commits so that if you look at the second commit, you can see the actual changes, as opposed to this being hidden among the moves.

    enhancement 
    opened by MicahChalmer 6
  • Write callbacks

    Write callbacks

    Hi,

    Thanks for making and maintaining rust-fuse! The library fills a very important slot in the ecosystem.

    I'm currently trying to implement the write support for my file system but there is something that I don't understand. I am working on macOS 10.13.

    If I issue an append command:

    $ echo "test" >> my_file.txt
    

    where my_file.txt is an existing, non-empty file in my file system, I see that the file will be opened with flags O_WRONLY. I don't see O_APPEND being passed. Is that correct?

    The call to open is followed by a call to write with offset 0.

    I was expecting either O_APPEND being passed to open and then write being done at offset 0, or O_APPEND isn't passed, and then write is done with offset equal to the current length of the file.

    I found some documentation about writeback caches on Linux, where the append mode is handled by the kernel, but no reference to this on macOS.

    Do you have any ideas about this issue? It's entirely possible that I'm misunderstanding all the calls.

    Thanks!

    question 
    opened by radupopescu 5
  • time::Timespec or std::time::SystemTime (fuse::FileAttr)

    time::Timespec or std::time::SystemTime (fuse::FileAttr)

    Would it be a good idea to patch to this? That would be a breaking change to fuse::FileAttr.

    (The need would be reduced significantly if Timespec implemented From)

    enhancement 
    opened by alilee 5
  • use of proc() { } causes compilation to fail

    use of proc() { } causes compilation to fail

    As of rustc version “rustc 0.13.0-nightly (42deaa5e4 2014-12-16 17:51:23 +0000)” the library fails to compile. The cause appears to be the removal of proc():

    $ cargo build
       Compiling fuse v0.2.0 (file:///home/phg/src/rust-dev/rust-fuse-git)
    src/reply.rs:27:34: 27:38 error: obsolete syntax: the `proc` type
    src/reply.rs:27     fn new (unique: u64, sender: proc(&[&[u8]]):Send) -> Self;
                                                     ^~~~
    note: use unboxed closures instead
    
    compatibility 
    opened by phi-gamma 5
  • Updates for cargo and rust-nightly

    Updates for cargo and rust-nightly

    I've incorporated @ebfe's #22 and @glittershark's #24, then added a few warning and deprecation fixes of my own. I also fleshed out Cargo.toml a bit more and updated .travis.yml with native rust support.

    compatibility 
    opened by cuviper 5
  • BackgroundSession does not stop filesystem thread on OS X

    BackgroundSession does not stop filesystem thread on OS X

    If you create a BackgroundSession object and destroy it, the background task running the real session won't actually terminate right away on OS X. It seems that the libc::read call is not interrupted by the call to fuse_unmount_compat22, so it won't kill the background task until something else tries to use the filesystem. Unmounting it externally (by running "umount" in another shell) does not appear to have this problem--it interrupts the read call right away. The problem also doesn't seem to happen on Linux.

    bug 
    opened by MicahChalmer 5
  • The Mac OS builds of Fuse have transitioned to macfuse

    The Mac OS builds of Fuse have transitioned to macfuse

    This changes the naming convention. The library follows same naming convention as Linux libfuse. The build does not need to make exception for Mac OS target

    opened by djinn 1
  • fuse-rs cannot build with target x86_64-unknown-linux-musl

    fuse-rs cannot build with target x86_64-unknown-linux-musl

    With target x86_64-unknown-linux-musl

    cargo build --jobs 10 --examples --target x86_64-unknown-linux-musl
       Compiling fuse-sys v0.4.0-dev (/home/teawater/fuse-rs/fuse-sys)
       Compiling regex v1.5.5
    error: failed to run custom build command for `fuse-sys v0.4.0-dev (/home/teawater/fuse-rs/fuse-sys)`
    
    Caused by:
      process didn't exit successfully: `/home/teawater/fuse-rs/target/debug/build/fuse-sys-b1102c79a2fb4df4/build-script-build` (exit status: 101)
      --- stdout
      cargo:rerun-if-env-changed=FUSE_NO_PKG_CONFIG
      cargo:rerun-if-env-changed=PKG_CONFIG_ALLOW_CROSS_x86_64-unknown-linux-musl
      cargo:rerun-if-env-changed=PKG_CONFIG_ALLOW_CROSS_x86_64_unknown_linux_musl
      cargo:rerun-if-env-changed=TARGET_PKG_CONFIG_ALLOW_CROSS
      cargo:rerun-if-env-changed=PKG_CONFIG_ALLOW_CROSS
      cargo:rerun-if-env-changed=PKG_CONFIG_x86_64-unknown-linux-musl
      cargo:rerun-if-env-changed=PKG_CONFIG_x86_64_unknown_linux_musl
      cargo:rerun-if-env-changed=TARGET_PKG_CONFIG
      cargo:rerun-if-env-changed=PKG_CONFIG
      cargo:rerun-if-env-changed=PKG_CONFIG_SYSROOT_DIR_x86_64-unknown-linux-musl
      cargo:rerun-if-env-changed=PKG_CONFIG_SYSROOT_DIR_x86_64_unknown_linux_musl
      cargo:rerun-if-env-changed=TARGET_PKG_CONFIG_SYSROOT_DIR
      cargo:rerun-if-env-changed=PKG_CONFIG_SYSROOT_DIR
    
      --- stderr
      pkg-config has not been configured to support cross-compilation.
    
      Install a sysroot for the target platform and configure it via
      PKG_CONFIG_SYSROOT_DIR and PKG_CONFIG_PATH, or install a
      cross-compiling wrapper for pkg-config and set it via
      PKG_CONFIG environment variable.
      thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: ()', fuse-sys/build.rs:12:10
      note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
    warning: build failed, waiting for other jobs to finish...
    error: build failed
    

    Without x86_64-unknown-linux-musl can build.

    cargo build --jobs 10 --examples
       Compiling cfg-if v1.0.0
       Compiling quick-error v1.2.3
       Compiling regex-syntax v0.6.25
       Compiling thread-scoped v1.0.2
       Compiling fuse-abi v0.4.0-dev (/home/teawater/fuse-rs/fuse-abi)
       Compiling termcolor v1.1.3
       Compiling libc v0.2.121
       Compiling memchr v2.4.1
       Compiling log v0.4.16
       Compiling fuse-sys v0.4.0-dev (/home/teawater/fuse-rs/fuse-sys)
       Compiling humantime v1.3.0
       Compiling aho-corasick v0.7.18
       Compiling atty v0.2.14
       Compiling fuse v0.4.0-dev (/home/teawater/fuse-rs)
       Compiling regex v1.5.5
       Compiling env_logger v0.6.2
        Finished dev [unoptimized + debuginfo] target(s) in 6.31s
    
    opened by teawater 2
  • fuse-rs does not compile on systems with libfuse3

    fuse-rs does not compile on systems with libfuse3

    I'm coming from the redox-os project which relies on fuse to build redoxfs.

    Steps to reproduce:

    install fuse3, clone fuse-rs, run cargo build.

    error: failed to run custom build command for `fuse v0.3.1`
    
    Caused by:
      process didn't exit successfully: `/home/liam/repos/redoxfs/target/debug/build/fuse-af7cecec4946dbaf/build-script-build` (exit status: 101)
      --- stdout
      cargo:rerun-if-env-changed=FUSE_NO_PKG_CONFIG
      cargo:rerun-if-env-changed=PKG_CONFIG
      cargo:rerun-if-env-changed=FUSE_STATIC
      cargo:rerun-if-env-changed=FUSE_DYNAMIC
      cargo:rerun-if-env-changed=PKG_CONFIG_ALL_STATIC
      cargo:rerun-if-env-changed=PKG_CONFIG_ALL_DYNAMIC
      cargo:rerun-if-env-changed=PKG_CONFIG_PATH_x86_64-unknown-linux-gnu
      cargo:rerun-if-env-changed=PKG_CONFIG_PATH_x86_64_unknown_linux_gnu
      cargo:rerun-if-env-changed=HOST_PKG_CONFIG_PATH
      cargo:rerun-if-env-changed=PKG_CONFIG_PATH
      cargo:rerun-if-env-changed=PKG_CONFIG_LIBDIR_x86_64-unknown-linux-gnu
      cargo:rerun-if-env-changed=PKG_CONFIG_LIBDIR_x86_64_unknown_linux_gnu
      cargo:rerun-if-env-changed=HOST_PKG_CONFIG_LIBDIR
      cargo:rerun-if-env-changed=PKG_CONFIG_LIBDIR
      cargo:rerun-if-env-changed=PKG_CONFIG_SYSROOT_DIR_x86_64-unknown-linux-gnu
      cargo:rerun-if-env-changed=PKG_CONFIG_SYSROOT_DIR_x86_64_unknown_linux_gnu
      cargo:rerun-if-env-changed=HOST_PKG_CONFIG_SYSROOT_DIR
      cargo:rerun-if-env-changed=PKG_CONFIG_SYSROOT_DIR
    
      --- stderr
      thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: Failure { command: "\"pkg-config\" \"--libs\" \"--cflags\" \"fuse\" \"fuse >= 2.6.0\"", output: Output { status: ExitStatus(ExitStatus(256)), stdout: "", stderr: "Package fuse was not found in the pkg-config search path.\nPerhaps you should add the directory containing `fuse.pc'\nto the PKG_CONFIG_PATH environment variable\nPackage 'fuse', required by 'virtual:world', not found\nPackage 'fuse', required by 'virtual:world', not found\n" } }', /home/liam/.cargo/registry/src/github.com-1ecc6299db9ec823/fuse-0.3.1/build.rs:10:76
      note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
    
    

    how to fix: When I switch the build.rs to search for fuse3 instead of fuse, the package compiles perfectly.

    opened by liamnaddell 1
  • Update MacOs compatibility to use more recent FUSE extension

    Update MacOs compatibility to use more recent FUSE extension

    The cask osxfuse is still on version 3.x of the library. This is pretty outdated, since there's already a 4.0.5. I updated the README to use another cask called macfuse which corresponds to the newer version of osxfuse. It seems that while moving up in versions, they also changed the library package name to "fuse" as on other platforms, instead of the previous "osxfuse". Hence, I also updated the build.rs file to be able to build on the newer version.

    Instead of just changing the name, we could also implement a check for both names: osxfuse and fuse when building on MacOS. I am happy to adapt this PR if you want. With this new library version, the crate builds perfectly fine on the new Apple Silicon MacBooks 👍

    opened by nschoellhorn 1
Owner
Andreas Neuhaus
Software engineer (Rust, Ruby, JS, C), technology enthusiast, Mac user, self-employed, hobby photographer
Andreas Neuhaus
Rust bindings to Linux Control Groups (cgroups)

cgroups-fs Native Rust library for managing Linux Control Groups (cgroups). This crate, curently, only supports the original, V1 hierarchy. You are we

Vlad Frolov 28 Nov 21, 2022
Idiomatic inotify wrapper for the Rust programming language

inotify-rs Idiomatic inotify wrapper for the Rust programming language. extern crate inotify; use std::env; use inotify::{ EventMask, Watch

Hanno Braun 220 Dec 26, 2022
nginx bindings for Rust

nginx-rs This crate provides nginx bindings for Rust. Currently, only Linux is supported. How to Use Add nginx crate to Cargo.toml [dependencies] ngin

ArvanCloud 104 Jan 2, 2023
Rust bindings for iptables

Rust iptables This crate provides bindings for iptables application in Linux (inspired by go-iptables). This crate uses iptables binary to manipulate

Navid 63 Nov 17, 2022
Rust friendly bindings to *nix APIs

Rust bindings to *nix APIs Documentation (Releases) Nix seeks to provide friendly bindings to various *nix platform APIs (Linux, Darwin, ...). The goa

null 2k Jan 4, 2023
Rust bindings to Windows API

winapi-rs Documentation Official communication channel: #windows-dev on the Rust Community Discord This crate provides raw FFI bindings to all of Wind

Peter Atashian 1.6k Jan 1, 2023
Rust bindings for the FreeBSD capsicum framework

capsicum Contain the awesome! Rust bindings for the FreeBSD capsicum framework for OS capability and sandboxing Prerequisites Rust, Cargo, and FreeBSD

Dan Robertson 52 Dec 5, 2022
The reference implementation of the Linux FUSE (Filesystem in Userspace) interface

libfuse About FUSE (Filesystem in Userspace) is an interface for userspace programs to export a filesystem to the Linux kernel. The FUSE project consi

null 4.2k Jan 4, 2023
Easy c̵̰͠r̵̛̠ö̴̪s̶̩̒s̵̭̀-t̶̲͝h̶̯̚r̵̺͐e̷̖̽ḁ̴̍d̶̖̔ ȓ̵͙ė̶͎ḟ̴͙e̸̖͛r̶̖͗ë̶̱́ṉ̵̒ĉ̷̥e̷͚̍ s̷̹͌h̷̲̉a̵̭͋r̷̫̊ḭ̵̊n̷̬͂g̵̦̃ f̶̻̊ơ̵̜ṟ̸̈́ R̵̞̋ù̵̺s̷̖̅ţ̸͗!̸̼͋

Rust S̵̓i̸̓n̵̉ I̴n̴f̶e̸r̵n̷a̴l mutability! Howdy, friendly Rust developer! Ever had a value get m̵̯̅ð̶͊v̴̮̾ê̴̼͘d away right under your nose just when

null 294 Dec 23, 2022
Userspace WireGuard® Implementation in Rust

BoringTun BoringTun is an implementation of the WireGuard® protocol designed for portability and speed. BoringTun is successfully deployed on millions

Cloudflare 4.8k Jan 8, 2023
Userspace WireGuard® Implementation in Rust

BoringTun BoringTun is an implementation of the WireGuard® protocol designed for portability and speed. BoringTun is successfully deployed on millions

Cloudflare 4.8k Jan 4, 2023
Userspace libpcap-based tool to mirror your dns traffic

DNS traffic mirroring tool (dns-mirror) Description Userspace libpcap-based tool. dns-mirror sniffs dns packets on the given interface and proxies it

Timofey 1 Mar 15, 2022
API bindings, CLI client and FUSE filesystem for Wiki.js written in Rust.

wikijs-rs API bindings, CLI client and FUSE filesystem for Wiki.js written in Rust. What's inside? Library: Rust bindings to Wiki.js's entire GraphQL

Sandro-Alessio Gierens 4 Sep 19, 2023
Fuse filesystem that returns symlinks to executables based on the PATH of the requesting process.

Envfs Fuse filesystem that returns symlinks to executables based on the PATH of the requesting process. This is useful to execute shebangs on NixOS th

Jörg Thalheim 98 Jan 2, 2023
Special FUSE filesystem to map /etc/resolv.conf to different files depending on Linux network namespace

Linux network namespaces allow separate networking environment for a group of processes (sharing uid or from a separate user). DNS settings (/etc/resolv.conf) are however shared between all those environments, which may be inconvenient in some setups.

Vitaly Shukela 2 May 16, 2022
A small in-memory filesystem using FUSE.

slabfs A small in-memory filesystem using FUSE. Running Simply run: RUST_LOG="slabfs=trace" cargo r -r -- <mountpoint> To suppress most log messages:

Carlos López 2 Jul 7, 2023
FUSE filesystem that provides FizzBuzz.txt(8 Exabyte)

FizzBuzzFS root@8a2db3fc6292:/# cd /mnt/FizzBuzz/ root@8a2db3fc6292:/mnt/FizzBuzz# ls -l total 9007199254740992 -rw-r--r-- 1 501 dialout 9223372036854

todesking 8 Oct 1, 2023
Rust 核心库和标准库的源码级中文翻译,可作为 IDE 工具的智能提示 (Rust core library and standard library translation. can be used as IntelliSense for IDE tools)

Rust 标准库中文版 这是翻译 Rust 库 的地方, 相关源代码来自于 https://github.com/rust-lang/rust。 如果您不会说英语,那么拥有使用中文的文档至关重要,即使您会说英语,使用母语也仍然能让您感到愉快。Rust 标准库是高质量的,不管是新手还是老手,都可以从中

wtklbm 493 Jan 4, 2023
Rust library for build scripts to compile C/C++ code into a Rust library

A library to compile C/C++/assembly into a Rust library/application.

Alex Crichton 1.3k Dec 21, 2022
Rust Imaging Library's Python binding: A performant and high-level image processing library for Python written in Rust

ril-py Rust Imaging Library for Python: Python bindings for ril, a performant and high-level image processing library written in Rust. What's this? Th

Cryptex 13 Dec 6, 2022