# guix-scheme
[](https://github.com/franzos/guix-scheme/actions/workflows/ci.yml)
Read/write Guix Scheme files from Rust: parse and edit `channels.scm` without losing comments or formatting, and generate `operating-system` configurations. Built on a lossless S-expression concrete syntax tree, so untouched parts of a file survive edits byte-for-byte.
| `guix-scheme` | Typed views over Guix files: channels read/add/remove, operating-system builder, record field access | [](https://crates.io/crates/guix-scheme) | [](https://docs.rs/guix-scheme) |
| `scheme-edit` | Generic lossless Scheme CST parser and editor (toml_edit-style), no Guix specifics | [](https://crates.io/crates/scheme-edit) | [](https://docs.rs/scheme-edit) |
## Editing channels.scm
```rust
use guix_scheme::{Channel, ChannelsFile};
let src = std::fs::read_to_string("channels.scm")?;
let mut cf = ChannelsFile::parse(&src)?;
cf.add_channel(&Channel {
name: "pantherx".into(),
url: "https://codeberg.org/gofranz/panther.git".into(),
branch: Some("master".into()),
commit: None,
introduction_commit: Some("54b4056ac571611892c743b65f4c47dc298c49da".into()),
introduction_fingerprint: Some("A36A D41E ECC7 A871 1003 5D24 524F EB1A 9D33 C9CB".into()),
})?;
cf.remove_channel("nonguix")?;
std::fs::write("channels.scm", cf.to_string())?;
```
Comments, indentation, and everything you didn't touch come back byte-identical.
## Generating an operating-system
```rust
use guix_scheme::os_builder::{FsDevice, OsBuilder, OsFlavor};
let config = OsBuilder::new(OsFlavor::Guix, "my-box", "Europe/Berlin", "en_US.utf8")
.bootloader_efi("/boot/efi")
.file_system("/", FsDevice::Label("root".into()), "ext4", false)
.user("franz", "Franz", &["wheel", "netdev", "audio", "video"])
.services_field("%desktop-services")
.build();
```
## Feature flags
- `guile-check` (guix-scheme): validate generated/edited source by feeding it through a real `guile` reader. Off by default; requires `guile` on `PATH` at runtime.
## MSRV
Rust 2021 edition; tested on current stable.
## Fixture sources
The test corpus (35 files under `scheme-edit/tests/fixtures/`) is copied verbatim
from GNU Guix, libguix, guix-install, and community configuration repos found via
[awesome-guix](https://github.com/franzos/awesome-guix). Each file keeps its
original copyright and license. Full credits:
[scheme-edit/tests/fixtures/SOURCES.md](scheme-edit/tests/fixtures/SOURCES.md).