1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
use crate::config::Config;
use crate::pubsub::{PubSub, TrialAction};
use crate::trial::Trial;
use crate::{ErrorKind, Result};
use std::collections::HashMap;
use structopt::StructOpt;

#[derive(Debug, StructOpt)]
#[structopt(rename_all = "kebab-case")]
pub struct TrialsOpt {
    pub study_name: String,
}

pub fn list_trials(opt: TrialsOpt, config: &Config) -> Result<Vec<Trial>> {
    let data_dir = track!(config.data_dir())?;
    let mut pubsub = PubSub::new(data_dir);
    let mut subscriber = track!(pubsub.subscribe(&opt.study_name))?;

    let mut trials = HashMap::new();
    for (id, action) in track!(subscriber.poll())? {
        match action {
            TrialAction::Start { id, timestamp } => {
                trials.insert(id, Trial::with_id_and_timestamp(id, timestamp));
            }
            TrialAction::Define { param } => {
                let trial = track_assert_some!(trials.get_mut(&id), ErrorKind::InvalidInput);
                trial.param_specs.insert(param.name, param.spec);
            }
            TrialAction::Sample { name, value } => {
                let trial = track_assert_some!(trials.get_mut(&id), ErrorKind::InvalidInput);
                trial.param_values.insert(name, value);
            }
            TrialAction::Report { step, metric } => {
                let trial = track_assert_some!(trials.get_mut(&id), ErrorKind::InvalidInput);
                trial.report(Some(step), &metric);
            }
            TrialAction::End => {}
        }
    }

    Ok(trials.into_iter().map(|(_, v)| v).collect())
}