Skip to content

Commit

Permalink
Fix NordicHPC#233 - add an error channel + test cases
Browse files Browse the repository at this point in the history
  • Loading branch information
Lars T Hansen committed Jan 29, 2025
1 parent ff4d5e0 commit 32d3918
Show file tree
Hide file tree
Showing 10 changed files with 391 additions and 138 deletions.
43 changes: 37 additions & 6 deletions src/gpu.rs
Original file line number Diff line number Diff line change
Expand Up @@ -76,14 +76,45 @@ pub trait GPU {
fn get_card_utilization(&mut self) -> Result<Vec<CardState>, String>;
}

pub trait GpuAPI {
fn probe(&self) -> Option<Box<dyn GPU>>;
}

// Probe the system for GPUs.

pub fn probe() -> Option<Box<dyn GPU>> {
if let Some(nvidia) = nvidia::probe() {
Some(nvidia)
} else if let Some(amd) = amd::probe() {
Some(amd)
} else {
pub struct RealGpuAPI {}

impl RealGpuAPI {
pub fn new() -> RealGpuAPI {
RealGpuAPI {}
}
}

impl GpuAPI for RealGpuAPI {
fn probe(&self) -> Option<Box<dyn GPU>> {
if let Some(nvidia) = nvidia::probe() {
Some(nvidia)
} else if let Some(amd) = amd::probe() {
Some(amd)
} else {
None
}
}
}

#[cfg(test)]
pub struct MockGpuAPI {}

#[cfg(test)]
impl MockGpuAPI {
pub fn new() -> MockGpuAPI {
MockGpuAPI {}
}
}

#[cfg(test)]
impl GpuAPI for MockGpuAPI {
fn probe(&self) -> Option<Box<dyn GPU>> {
None
}
}
2 changes: 1 addition & 1 deletion src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,7 @@ fn main() {
sysinfo::show_system(writer, &timestamp, *csv);
}
Commands::Slurmjobs { window, span, json } => {
slurmjobs::show_slurm_jobs(writer, window, span, *json);
slurmjobs::show_slurm_jobs(writer, window, span, &timestamp, *json);
}
Commands::Version {} => {
show_version(writer);
Expand Down
18 changes: 18 additions & 0 deletions src/output.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ use crate::util;

use std::io;

#[derive(Debug)]
pub enum Value {
A(Array),
O(Object),
Expand All @@ -18,11 +19,13 @@ pub enum Value {
E(), // Empty array element only, never a field or toplevel value
}

#[derive(Debug)]
struct Field {
tag: String,
value: Value,
}

#[derive(Debug)]
pub struct Object {
fields: Vec<Field>,
}
Expand All @@ -37,6 +40,16 @@ impl Object {
self.fields.is_empty()
}

#[cfg(test)]
pub fn get(&self, key: &str) -> Option<&Value> {
for f in &self.fields {
if key == &f.tag {
return Some(&f.value);
}
}
None
}

pub fn push(&mut self, tag: &str, value: Value) {
self.fields.push(Field {
tag: tag.to_string(),
Expand Down Expand Up @@ -83,6 +96,7 @@ impl Object {
}
}

#[derive(Debug)]
pub struct Array {
elements: Vec<Value>,
nonempty_base45: bool,
Expand Down Expand Up @@ -115,6 +129,10 @@ impl Array {
self.elements.len()
}

pub fn at(&self, i: usize) -> &Value {
&self.elements[i]
}

pub fn push_o(&mut self, o: Object) {
self.push(Value::O(o));
}
Expand Down
Loading

0 comments on commit 32d3918

Please sign in to comment.