Skip to content

Instantly share code, notes, and snippets.

@JosiahParry
Last active January 4, 2025 20:52
Show Gist options
  • Save JosiahParry/1d3d8bbbda340f1502451fb0fdb5f5f4 to your computer and use it in GitHub Desktop.
Save JosiahParry/1d3d8bbbda340f1502451fb0fdb5f5f4 to your computer and use it in GitHub Desktop.
{renv} reader and writer in Rust
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use std::fs::File;
use std::io::BufReader;
use std::path::Path;
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct RenvLock {
pub r: RenvRVersion,
// Note that each apckage should be untagged
pub packages: HashMap<String, RenvPackage>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct RenvRVersion {
pub version: String,
pub repositories: Vec<RenvRepository>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RenvRepository {
#[serde(rename = "Name")]
pub name: Option<String>,
#[serde(rename = "URL")]
pub url: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct RenvPackage {
pub package: String,
pub version: String,
pub source: String,
pub repository: String,
pub requirements: Option<Vec<String>>,
pub hash: String,
}
impl RenvLock {
pub fn read<P: AsRef<Path>>(path: P) -> anyhow::Result<Self> {
let file = File::open(path.as_ref())?;
let reader = BufReader::new(file);
let renv_lock: RenvLock = serde_json::from_reader(reader)?;
Ok(renv_lock)
}
pub fn write<P: AsRef<Path>>(&self, path: P) -> anyhow::Result<()> {
let f = std::fs::File::create(&path)?;
serde_json::to_writer_pretty(&f, self)?;
Ok(())
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment