mirror of
https://github.com/oxalica/nil.git
synced 2024-10-27 12:30:52 +03:00
Parse flake outputs and add flake package meta
This commit is contained in:
parent
73fda84341
commit
775ba9e6ac
101
crates/nix-interop/src/flake_output.rs
Normal file
101
crates/nix-interop/src/flake_output.rs
Normal file
@ -0,0 +1,101 @@
|
|||||||
|
use std::collections::HashMap;
|
||||||
|
use std::path::Path;
|
||||||
|
use std::process::{Command, Stdio};
|
||||||
|
|
||||||
|
use anyhow::{ensure, Context, Result};
|
||||||
|
use serde::Deserialize;
|
||||||
|
|
||||||
|
pub fn eval_flake_output(nix_command: &Path, flake_path: &Path) -> Result<FlakeOutput> {
|
||||||
|
let output = Command::new(nix_command)
|
||||||
|
.args([
|
||||||
|
"flake",
|
||||||
|
"show",
|
||||||
|
"--experimental-features",
|
||||||
|
"nix-command flakes",
|
||||||
|
"--json",
|
||||||
|
"--legacy",
|
||||||
|
])
|
||||||
|
.arg(flake_path)
|
||||||
|
.stdin(Stdio::null())
|
||||||
|
.stdout(Stdio::piped())
|
||||||
|
.stderr(Stdio::piped())
|
||||||
|
.output()
|
||||||
|
.context("Failed to spawn `nix`")?;
|
||||||
|
|
||||||
|
ensure!(
|
||||||
|
output.status.success(),
|
||||||
|
"`nix flake show` failed with {}. Stderr:\n{}",
|
||||||
|
output.status,
|
||||||
|
String::from_utf8_lossy(&output.stderr),
|
||||||
|
);
|
||||||
|
|
||||||
|
let val = serde_json::from_slice(&output.stdout)?;
|
||||||
|
Ok(val)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, PartialEq, Eq, Deserialize)]
|
||||||
|
#[serde(untagged)]
|
||||||
|
pub enum FlakeOutput {
|
||||||
|
Leaf(Leaf),
|
||||||
|
Attrset(HashMap<String, FlakeOutput>),
|
||||||
|
}
|
||||||
|
|
||||||
|
impl FlakeOutput {
|
||||||
|
pub fn as_leaf(&self) -> Option<&Leaf> {
|
||||||
|
match self {
|
||||||
|
Self::Leaf(v) => Some(v),
|
||||||
|
_ => None,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn as_attrset(&self) -> Option<&HashMap<String, FlakeOutput>> {
|
||||||
|
match self {
|
||||||
|
Self::Attrset(v) => Some(v),
|
||||||
|
_ => None,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, PartialEq, Eq, Deserialize)]
|
||||||
|
#[serde(rename_all = "camelCase")]
|
||||||
|
pub struct Leaf {
|
||||||
|
#[serde(rename = "type")]
|
||||||
|
pub type_: Type,
|
||||||
|
pub name: Option<String>,
|
||||||
|
pub description: Option<String>,
|
||||||
|
}
|
||||||
|
|
||||||
|
// https://github.com/NixOS/nix/blob/2.14.1/src/nix/flake.cc#L1105
|
||||||
|
#[derive(Debug, Clone, PartialEq, Eq, Deserialize)]
|
||||||
|
#[serde(rename_all = "camelCase")]
|
||||||
|
pub enum Type {
|
||||||
|
NixosModule,
|
||||||
|
Derivation,
|
||||||
|
#[serde(other)]
|
||||||
|
Unknown,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
#[ignore = "requires calling 'nix'"]
|
||||||
|
fn self_() {
|
||||||
|
let dir = std::env::var("CARGO_MANIFEST_DIR").unwrap();
|
||||||
|
let output = eval_flake_output("nix".as_ref(), dir.as_ref()).unwrap();
|
||||||
|
let leaf = (|| {
|
||||||
|
output.as_attrset()?["packages"].as_attrset()?["x86_64-linux"].as_attrset()?["nil"]
|
||||||
|
.as_leaf()
|
||||||
|
})()
|
||||||
|
.unwrap();
|
||||||
|
assert_eq!(leaf.type_, Type::Derivation);
|
||||||
|
assert!(leaf.name.as_ref().unwrap().starts_with("nil-unstable-"));
|
||||||
|
assert!(leaf
|
||||||
|
.description
|
||||||
|
.as_ref()
|
||||||
|
.unwrap()
|
||||||
|
.to_lowercase()
|
||||||
|
.contains("language server"));
|
||||||
|
}
|
||||||
|
}
|
@ -1,6 +1,7 @@
|
|||||||
//! Nix defined file structures and interoperation with Nix.
|
//! Nix defined file structures and interoperation with Nix.
|
||||||
pub mod eval;
|
pub mod eval;
|
||||||
pub mod flake_lock;
|
pub mod flake_lock;
|
||||||
|
pub mod flake_output;
|
||||||
pub mod nixos_options;
|
pub mod nixos_options;
|
||||||
|
|
||||||
pub const DEFAULT_IMPORT_FILE: &str = "default.nix";
|
pub const DEFAULT_IMPORT_FILE: &str = "default.nix";
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
{
|
rec {
|
||||||
description = "Language Server for Nix Expression Language";
|
description = "Language Server for Nix Expression Language";
|
||||||
|
|
||||||
inputs = {
|
inputs = {
|
||||||
@ -28,6 +28,12 @@
|
|||||||
nativeBuildInputs = [ nix.out ];
|
nativeBuildInputs = [ nix.out ];
|
||||||
|
|
||||||
CFG_RELEASE = "git-${rev}";
|
CFG_RELEASE = "git-${rev}";
|
||||||
|
|
||||||
|
meta = {
|
||||||
|
inherit description;
|
||||||
|
homepage = "https://github.com/oxalica/nil";
|
||||||
|
license = with lib.licenses; [ mit asl20 ];
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
mkCocNil = { runCommand, nodejs, esbuild }:
|
mkCocNil = { runCommand, nodejs, esbuild }:
|
||||||
|
Loading…
Reference in New Issue
Block a user