Finished into_json() functionality.

[?]
Jun 24, 2021, 7:55 AM
2SABVMY3A2RZDF3KJXZSMJ2UQ4Q5EW422G4DVBJRKK26S2ESGVQAC

Dependencies

  • [2] U4VCAFXQ Added data_type to TSSpec key.
  • [3] JTX5OHWH Added USA CPI.
  • [4] LVMGQJGH Finished framework for checking series specifications with data.
  • [5] 77SIQZ3E Separating out spec generation.
  • [6] CUADTSHQ Save csv data as multiple files.
  • [7] AT753JPO Selected US unemployment series.
  • [8] GQVS55HI Finished generate_ts_spec() function.
  • [9] 5POF332L Working on fn cpi_included().
  • [*] 4MG5JFXT First record.

Change contents

  • edit in src/serve_ts.rs at line 1
    [3.7119][3.7120:7194](),[3.7194][2.0:142](),[2.142][3.7347:7507](),[3.7347][3.7347:7507](),[3.7507][2.143:204](),[2.204][3.7572:7581](),[3.7572][3.7572:7581]()
    //! Deserialize data to be served as JSON to build time-series plots.
    //!
    //! The `TSSpec::TSPageSpec::TSGraphicSpec` group of data-structures mirrors
    //! `ts_spec.keytree`. Its main function is TSSpec::new(PageJson
    //!
    //! The `PageJson::GraphicJson::SeriesJson` group of datastructures is convertible into Json and
    //! served to the client. Its main function is
    //!
    //! ```
    //! PageJson::new(ts_spec: TSSpec, checked_spec: Checked...)
    //! ```
  • replacement in src/serve_ts.rs at line 2
    [3.7612][3.7612:7664]()
    use std::convert::{TryFrom, TryInto};
    use std::env;
    [3.7612]
    [3.7664]
    use std::convert::{
    Into,
    TryInto,
    };
  • edit in src/serve_ts.rs at line 12
    [3.7761][3.7761:7781]()
    use keytree::Error;
  • edit in src/serve_ts.rs at line 18
    [3.7888][3.7888:7904]()
    TimeSeries,
  • edit in src/serve_ts.rs at line 21
    [3.7929]
    [3.7929]
    use crate::error::{
    Error,
    };
  • replacement in src/serve_ts.rs at line 25
    [3.7954][3.7954:7975]()
    CheckedDataSpec,
    [3.7954]
    [3.7975]
    IndexedCheckedDataSpec,
  • replacement in src/serve_ts.rs at line 31
    [3.8100][2.205:327]()
    /// The specification for HTML pages that present a series of time-series plots. The keytree
    /// specification looks like
    [3.8100]
    [2.327]
    /// Top-level time-series specification data-structure.
    ///
    /// It can be serialized into something like,
  • replacement in src/serve_ts.rs at line 50
    [3.8167][2.682:711]()
    pub fn new() -> TSSpec {
    [3.8167]
    [2.711]
    pub (crate) fn new() -> TSSpec {
  • replacement in src/serve_ts.rs at line 54
    [3.8238][2.739:786]()
    pub fn push(&mut self, item: TSPageSpec) {
    [3.8238]
    [3.8288]
    pub (crate) fn push(&mut self, item: TSPageSpec) {
  • replacement in src/serve_ts.rs at line 58
    [2.788][2.788:831]()
    pub fn from_file(path: &str) -> Self {
    [2.788]
    [2.831]
    pub (crate) fn from_file(path: &str) -> Self {
  • edit in src/serve_ts.rs at line 62
    [2.980]
    [2.980]
    }
    /// ts_spec:
    /// page:
    /// data_type: u
    /// country: Australia
    /// graphic:
    /// series:
    /// id: AUSURANAA
    /// id: AUSURAQS
    /// id: AUSURHARMADSMEI
    /// id: AUSURHARMMDSMEI
    pub fn into_json(
    &self,
    data_spec: &IndexedCheckedDataSpec,
    root_path: &str) -> Result<TSJson, Error>
    {
    let mut ts_json = TSJson::new();
    for page_spec in &self.0 {
    let key = page_spec.key();
    let mut value: Vec<GraphicJson> = Vec::new();
    for graphic in &page_spec.graphics {
    let json = graphic.into_json(data_spec, root_path)?;
    value.push(json);
    };
    ts_json.insert(&key, value);
    }
    Ok(ts_json)
  • edit in src/serve_ts.rs at line 94
    [2.986]
    [3.8320]
    // // We don't want to pass off responsibility to the struct's components, as we need
    // // to use the h HashMap, so we loop down to series.
    // /// Build from a `TSSpec`.
    // pub fn new(ts_spec: TSSpec, data_spec: IndexCheckedDataSpec) -> Self {
    // let ts_spec = TSSpec::from_file("ts_spec.keytree");
    // // loop through pages in ts_spec
    // let page_json = PageJson::new(
    // let h: HashMap<String, usize> = HashMap::new();
    // for (i, series) in data_spec.0.enumerate() {
    // for series
    // h.insert(series.id, i);
    // }
    // let ts:
    // let mut builder = TSJson(HashMap::new());
    // for ts_page in ts_spec.pages() {
    // let page_json = ts_page.to_page_json()
    // builder.insert(page_json.key(), page_json);
    // }
    //
    // PageJson(builder)
    // }
  • replacement in src/serve_ts.rs at line 142
    [2.1178][3.8637:8661](),[3.8637][3.8637:8661]()
    type Error = Error;
    [2.1178]
    [3.8661]
    type Error = keytree::Error;
  • replacement in src/serve_ts.rs at line 144
    [3.8662][2.1179:1228]()
    fn try_into(self) -> Result<TSSpec, Error> {
    [3.8662]
    [2.1228]
    fn try_into(self) -> Result<TSSpec, Self::Error> {
  • edit in src/serve_ts.rs at line 151
    [2.1353]
    [2.1353]
    ///
  • edit in src/serve_ts.rs at line 165
    [2.1723]
    [2.1723]
    ///
  • edit in src/serve_ts.rs at line 167
    [2.1752]
    [2.1752]
    ///
  • edit in src/serve_ts.rs at line 169
    [2.1782]
    [3.8890]
    ///
  • replacement in src/serve_ts.rs at line 174
    [2.1801][2.1801:1870]()
    pub fn new(key: PageKey, graphics: Vec<TSGraphicSpec>) -> Self {
    [2.1801]
    [2.1870]
    pub (crate) fn new(key: PageKey, graphics: Vec<TSGraphicSpec>) -> Self {
  • replacement in src/serve_ts.rs at line 177
    [2.1891][2.1891:1963](),[2.1963][3.9078:9110](),[3.9078][3.9078:9110]()
    country: key.country,
    data_type: key.data_type,
    graphics: graphics,
    [2.1891]
    [3.9110]
    country: key.country,
    data_type: key.data_type,
    graphics: graphics,
  • replacement in src/serve_ts.rs at line 183
    [2.1965][2.1965:2000]()
    pub fn key(&self) -> PageKey {
    [2.1965]
    [2.2000]
    pub (crate) fn key(&self) -> PageKey {
  • replacement in src/serve_ts.rs at line 185
    [2.2018][2.2018:2092]()
    country: self.country,
    data_type: self.data_type,
    [2.2018]
    [2.2092]
    country: self.country,
    data_type: self.data_type,
  • replacement in src/serve_ts.rs at line 207
    [2.2365][3.9522:9546](),[3.9522][3.9522:9546]()
    type Error = Error;
    [2.2365]
    [3.9546]
    type Error = keytree::Error;
  • replacement in src/serve_ts.rs at line 209
    [3.9547][2.2366:2419]()
    fn try_into(self) -> Result<TSPageSpec, Error> {
    [3.9547]
    [3.9603]
    fn try_into(self) -> Result<TSPageSpec, Self::Error> {
  • replacement in src/serve_ts.rs at line 225
    [3.9861][3.9861:9937]()
    /// Specifies the data files required for a graphic in the '/source' route.
    [3.9861]
    [3.9937]
    /// Component of `TSSpec`.
    ///
  • edit in src/serve_ts.rs at line 228
    [3.9964]
    [3.9964]
    /// Heigh in pixels of the graphic.
  • replacement in src/serve_ts.rs at line 231
    [3.9993][3.9993:10026]()
    // e.g. AUSURHARMADSMEI, ...
    [3.9993]
    [3.10026]
    /// e.g. [ AUSURHARMADSMEI, ... ]
  • replacement in src/serve_ts.rs at line 237
    [3.10084][3.10084:10111]()
    pub fn new() -> Self {
    [3.10084]
    [3.10111]
    pub (crate) fn new() -> Self {
  • replacement in src/serve_ts.rs at line 245
    [3.10214][3.10214:10253]()
    pub fn push(&mut self, id: &str) {
    [3.10214]
    [3.10253]
    pub (crate) fn push(&mut self, id: &str) {
  • edit in src/serve_ts.rs at line 247
    [3.10298]
    [3.10298]
    }
    pub (crate) fn into_json(
    &self,
    data_spec: &IndexedCheckedDataSpec,
    root_path: &str) -> Result<GraphicJson, Error>
    {
    let mut series_json = SeriesJson::new();
    for series_id in &self.series_ids {
    let ts = data_spec.time_series_data(series_id.clone(), root_path)?;
    let meta = data_spec.meta(series_id.to_string(), root_path);
    series_json.push(ts, meta);
    }
    Ok(
    GraphicJson {
    height: self.height,
    series: series_json,
    }
    )
  • replacement in src/serve_ts.rs at line 292
    [3.10781][3.10781:10805]()
    type Error = Error;
    [3.10781]
    [3.10805]
    type Error = keytree::Error;
  • replacement in src/serve_ts.rs at line 294
    [3.10806][3.10806:10862]()
    fn try_into(self) -> Result<TSGraphicSpec, Error> {
    [3.10806]
    [3.10862]
    fn try_into(self) -> Result<TSGraphicSpec, Self::Error> {
  • replacement in src/serve_ts.rs at line 308
    [3.11319][3.11319:11376](),[3.11376][2.2713:2822]()
    pub struct PageJson(HashMap<PageKey, Vec<GraphicJson>>);
    impl PageJson {
    // Build from a `TSSpec`.
    pub fn new(page_spec: TSSpec, data_root: &str) -> Self {
    [3.11319]
    [2.2822]
    pub struct TSJson(HashMap<PageKey, Vec<GraphicJson>>);
  • replacement in src/serve_ts.rs at line 310
    [2.2823][2.2823:2883](),[2.2883][3.11376:11377](),[3.11376][3.11376:11377](),[3.11377][2.2884:2902]()
    let ts_spec = TSSpec::from_file("ts_spec.keytree");
    [2.2823]
    [2.2902]
    impl TSJson {
  • edit in src/serve_ts.rs at line 312
    [2.2903]
    [2.2903]
    pub (crate) fn new() -> TSJson {
    TSJson(HashMap::new())
    }
  • replacement in src/serve_ts.rs at line 316
    [2.2904][2.2904:2937]()
    PageJson(HashMap::new())
    [2.2904]
    [2.2937]
    pub (crate) fn insert(&mut self, key: &PageKey, value: Vec<GraphicJson>) {
    match self.0.get_mut(key) {
    Some(_) => {
    println!("Tried to insert page_key: {:?} twice.", key);
    panic!();
    },
    None => { self.0.insert(*key, value); },
    }
  • edit in src/serve_ts.rs at line 330
    [3.11485]
    [3.11485]
    ///
  • edit in src/serve_ts.rs at line 332
    [3.11514]
    [3.11514]
    ///
  • replacement in src/serve_ts.rs at line 338
    [3.11636][3.11636:11715]()
    pub struct SeriesJson {
    data: Vec<(RegularTimeSeries<1>, SeriesMetaData)>,
    [3.11636]
    [3.11715]
    pub struct SeriesJson(Vec<(RegularTimeSeries<1>, SeriesMetaData)>);
    impl SeriesJson {
    /// Create a new, empty `SeriesJson`.
    pub fn new() -> Self {
    SeriesJson(Vec::new())
    }
    /// Push time-series data and associated meta-data onto `SeriesJson`.
    pub fn push(&mut self, ts: RegularTimeSeries<1>, meta: SeriesMetaData) {
    self.0.push((ts, meta));
    }
  • replacement in src/serve_ts.rs at line 353
    [3.11772][3.11772:11816]()
    #[derive(Clone, Copy, Eq, Hash, PartialEq)]
    [3.11772]
    [3.11816]
    #[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
  • edit in src/serve_ts.rs at line 355
    [3.11837]
    [3.11837]
    ///
  • edit in src/serve_ts.rs at line 357
    [3.11866]
    [3.11866]
    ///
  • replacement in src/serve_ts.rs at line 362
    [3.11942][3.11942:11966]()
    type Error = Error;
    [3.11942]
    [3.11966]
    type Error = keytree::Error;
  • replacement in src/serve_ts.rs at line 364
    [3.11967][3.11967:12081]()
    fn try_into(self) -> Result<PageKey, Error> {
    let data_type_str: String = self.at("key::data_type")?;
    [3.11967]
    [3.12081]
    fn try_into(self) -> Result<PageKey, Self::Error> {
    let data_type_str: String = self.at("key::data_type")
    .map_err(|err| err.into())?;
  • replacement in src/serve_ts.rs at line 371
    [3.12227][3.12227:12287]()
    let country_str: String = self.at("key::country")?;
    [3.12227]
    [3.12287]
    let country_str: String = self.at("key::country")
    .map_err(|err| err.into())?;
  • edit in src/lib.rs at line 1
    [11.16]
    [3.10187]
    #![deny(missing_docs)]
  • edit in src/lib.rs at line 38
    [3.12781]
    [3.12781]
    //! ```
    //! The specification will look something like,
  • edit in src/lib.rs at line 41
    [3.12789]
    [3.12789]
    //! seriess:
    //! series:
    //! data_type: u
    //! country: Australia
    //! id: AUSURAMS
    //! series:
    //! data_type: u
    //! country: Australia
    //! id: AUSURANAA
    //! series:
    //! data_type: u
    //! country: Australia
    //! id: AUSURAQS
    //! series:
    //! data_type: u
    //! country: Australia
    //! id: AUSURHARMADSMEI
    //! series:
    //! data_type: u
    //! country: Australia
    //! id: AUSURHARMMDSMEI
    //! ```
    //! ### Step 2. Check and Save Data
  • replacement in src/lib.rs at line 65
    [3.12793][3.12845:12872](),[3.12872][3.12877:12881](),[3.12877][3.12877:12881]()
    //! ### Step 3. Save Data
    //!
    [3.12793]
    [3.12881]
    //! The saved data will look something like
    //! ```text
    //! seriess:
    //! series:
    //! data_type: u
    //! country: Australia
    //! id: AUSURAMS
    //! error: ok
    //! time_stamp: 2021-06-20 9:33:39
    //! series:
    //! data_type: u
    //! country: Australia
    //! id: AUSURANAA
    //! error: ok
    //! time_stamp: 2021-06-20 9:33:41
    //! series:
    //! data_type: u
    //! country: Australia
    //! id: AUSURAQS
    //! error: ok
    //! time_stamp: 2021-06-20 9:33:42
    //! ```
  • replacement in src/lib.rs at line 89
    [3.12877][3.12877:12917]()
    //! ### Step 4*. Bootstrap TSPageSpec.
    [3.12877]
    [3.12975]
    //! ### Step 3*. Bootstrap TSPageSpec.
  • replacement in src/lib.rs at line 91
    [3.12979][3.12918:12952]()
    //! ### Step 4. Serve Time-series
    [3.12979]
    [3.13017]
    //! To generate a generic time-series specification,
    //! ```
    //! checked_data_spec
    //! .from_file("data_spec.keytree")
    //! .bootstrap_ts_spec;
    //! ```
    //! The specification will look something like
    //! ```
    //! page:
    //! country:
    //! name: Australia
    //! graphic:
    //! series:
    //! id: AUSURANAA
    //! id: AUSURAQS
    //! id: AUSURHARMADSMEI
    //! id: AUSURHARMMDSMEI
    //! ```
    //! Once it has been generated with the full set of data, we want to be able to edit it manually.
    //!
    //! ### Step 3. Serve Time-series
    //!
    //! The structure of JSON which is served to the client is determined by `Serialize`-able data
    //! structures. The top structure is `TSJson`. The `ts_spec.keytree` file specifies the graphics on
    //! each page, and what data each graphic uses. The `ts_spec.keytree` file is deserialized into
    //! `TSSpec`.
  • edit in src/lib.rs at line 118
    [3.13021]
    [3.12953]
    //! The procedure is generally to read in the specification in `ts_spec.keytree`, and to read in the
    //! `data_spec.keytree` which specifies data available, and also acts as a gate-keeper for that
    //! data.
    //! ```
    //! // Read in the data specification.
    //! let data_spec = CheckedData::from_file("data_spec.keytree").indexed();
    //!
    //! // Read in the time-series specification.
    //! let ts_spec = TSSpec::from_file("ts_spec.keytree");
    //!
    //! // Load all data to memory. The server uses `ts_json` as a data-store to respond to data
    //! // requests.
    //! let ts_json = ts_spec.into_json(data_spec);
    //! ```
    //! Then `TSSpec` uses `IndexedCheckedDataSpec` as an argument to be converted into `TSJson`.
    //!
    //!
  • edit in src/lib.rs at line 142
    [3.799]
    [3.13208]
    ///
  • edit in src/lib.rs at line 144
    [3.13228]
    [3.13165]
    ///
  • edit in src/lib.rs at line 147
    [3.13185]
    [3.13229]
    ///
    pub mod error;
    ///
  • edit in src/lib.rs at line 153
    [3.13247]
    [3.13247]
  • replacement in src/lib.rs at line 163
    [3.10867][3.10867:10922]()
    #[derive(Clone, Copy, Eq, Hash, PartialEq, Serialize)]
    [3.10867]
    [3.10922]
    #[derive(Clone, Copy, Debug, Eq, Hash, PartialEq, Serialize)]
  • edit in src/lib.rs at line 176
    [3.11076]
    [3.11076]
    /// Parse a string into a `DataType` or return `None` on failure.
  • edit in src/lib.rs at line 220
    [3.5380][3.2392:2482](),[3.2482][3.11625:11628]()
    pub fn usa_cpi() -> String {
    Fred::tags_series("cpi;usa;nation").unwrap().to_string()
    }
  • edit in src/check_data.rs at line 4
    [3.13268][3.13301:13325]()
    use std::path::PathBuf;
  • replacement in src/check_data.rs at line 5
    [3.13326][3.13326:13355]()
    use time::PrimitiveDateTime;
    [3.13326]
    [3.13355]
    use time::OffsetDateTime;
  • edit in src/check_data.rs at line 13
    [3.13358][3.13358:13378]()
    use keytree::Error;
  • edit in src/check_data.rs at line 16
    [3.13440]
    [3.13440]
    };
    use time_series::{
    RegularTimeSeries,
    TimeSeries,
  • replacement in src/check_data.rs at line 23
    [3.13505][3.13378:13411]()
    use crate::build_spec::DataSpec;
    [3.13505]
    [3.13411]
    use crate::build_spec::{
    DataSpec,
    };
    use crate::error::{
    Error,
    ErrorKind,
    };
  • edit in src/check_data.rs at line 38
    [3.13522]
    [3.13522]
    /// Check for errors that might have occurred somewhere along the toolchain.
  • edit in src/check_data.rs at line 68
    [3.14593]
    [3.14593]
    }
    }
    // Its better for CheckedDataSpec to be a Vec, but we need to index into the Vec, so
    // we wrap it with an index.
    /// `CheckedDataSpec` wrapped in an index for faster lookup.
    pub struct IndexedCheckedDataSpec {
    data: CheckedDataSpec,
    index: HashMap<String, usize>,
    }
    impl IndexedCheckedDataSpec {
    /// Return the time-series data for `series_id`.
    pub fn time_series_data(
    &self,
    series_id: String,
    root_path: &str) -> Result<RegularTimeSeries<1>, Error>
    {
    let i = match self.index.get(&series_id) {
    Some(i) => i,
    None => {
    println!("Series {} not found in IndexedCheckedDataSpec::index.", series_id);
    panic!();
    },
    };
    let checked_series = self.data.series_from_index(*i);
    if checked_series.error != "ok" {
    return Err(Error::new(
    ErrorKind::SpecErrorStatus(series_id, checked_series.error.clone())
    ))
    };
    let path = &format!(
    "{}/{}/{}/{}.csv",
    root_path,
    checked_series.data_type,
    checked_series.country,
    series_id,
    );
    Ok(
    TimeSeries::<1>::from_csv(&path).try_into()
    .map_err(|err| Error::new(
    ErrorKind::NotRegular(checked_series.id.clone())
    ))?
    )
    }
    /// Return the meta-data for `series_id`.
    pub fn meta(&self, series_id: String, root_path: &str) -> SeriesMetaData {
    let i = match self.index.get(&series_id) {
    Some(i) => i,
    None => {
    println!("Series {} not found in IndexedCheckedDataSpec::index.", series_id);
    panic!();
    },
    };
    let checked_series = self.data.series_from_index(*i);
    let path = &format!(
    "{}/{}/{}/{}.csv",
    root_path,
    checked_series.data_type,
    checked_series.country,
    series_id,
    );
    let meta_str = fs::read_to_string(path).unwrap();
    let kt = KeyTree::parse(&meta_str).unwrap();
    kt.to_ref().try_into().unwrap()
  • edit in src/check_data.rs at line 157
    [3.14803]
    [3.14803]
    fn series_from_index(&self, i: usize) -> &CheckedSourceSeries {
    &self.0[i]
    }
  • edit in src/check_data.rs at line 183
    [3.14230]
    [3.14230]
    }
    /// Wrap CheckedDataSpec with an index into its inner `Vec`.
    pub fn into_indexed(self) -> IndexedCheckedDataSpec {
    let mut h: HashMap<String, usize> = HashMap::new();
    for (i, series) in self.0.iter().enumerate() {
    h.insert(series.id.clone(), i);
    }
    IndexedCheckedDataSpec {
    data: self,
    index: h
    }
  • replacement in src/check_data.rs at line 239
    [3.15471][3.15471:15495]()
    type Error = Error;
    [3.15471]
    [3.15495]
    type Error = keytree::Error;
  • replacement in src/check_data.rs at line 241
    [3.15496][3.15496:15554]()
    fn try_into(self) -> Result<CheckedDataSpec, Error> {
    [3.15496]
    [3.15554]
    fn try_into(self) -> Result<CheckedDataSpec, Self::Error> {
  • replacement in src/check_data.rs at line 243
    [3.15566][3.15566:15623]()
    CheckedDataSpec(self.vec("seriess:series")?)
    [3.15566]
    [3.15623]
    CheckedDataSpec(self.vec("seriess::series")?)
  • edit in src/check_data.rs at line 262
    [3.15945]
    [3.15647]
    ///
  • edit in src/check_data.rs at line 265
    [3.15677]
    [3.15677]
    ///
  • edit in src/check_data.rs at line 268
    [3.15706]
    [3.15706]
    ///
  • edit in src/check_data.rs at line 271
    [3.15734]
    [3.15734]
    /// Used to track problems and to check that data is consistent before serving to client.
  • replacement in src/check_data.rs at line 274
    [3.15762][3.15762:15815]()
    pub time_stamp: Option<time::PrimitiveDateTime>,
    [3.15762]
    [3.15815]
    ///
    pub time_stamp: Option<time::OffsetDateTime>,
  • edit in src/check_data.rs at line 281
    [2.3688]
    [2.3688]
    /// Return a key.
  • replacement in src/check_data.rs at line 324
    [3.16806][3.16806:16868]()
    self.time_stamp = Some(PrimitiveDateTime::now());
    [3.16806]
    [3.16868]
    self.time_stamp = Some(OffsetDateTime::now_utc());
  • replacement in src/check_data.rs at line 404
    [3.18761][3.18761:18836]()
    Some(PrimitiveDateTime::parse(date_str, "%Y %T").unwrap())
    [3.18761]
    [3.18836]
    Some(OffsetDateTime::parse(date_str, "%Y %T").unwrap())
  • edit in src/check_data.rs at line 448
    [3.19874]
    [3.19874]
    impl SeriesMetaData {
    ///
    pub fn from_file(
    data_type: DataType,
    country: Country,
    series_id: String,
    root_path: &str) -> Result<Self, Error>
    {
    let path = &format!(
    "{}/{}/{}/{}.meta",
    root_path,
    data_type,
    country,
    series_id,
    );
    let meta_str = fs::read_to_string(&path).unwrap();
    let kt = KeyTree::parse(&meta_str).unwrap();
    Ok(kt.to_ref().try_into().unwrap())
    }
    }
  • replacement in src/check_data.rs at line 474
    [3.19929][3.19929:19953]()
    type Error = Error;
    [3.19929]
    [3.19953]
    type Error = keytree::Error;
  • replacement in src/check_data.rs at line 476
    [3.19954][3.19954:20011]()
    fn try_into(self) -> Result<SeriesMetaData, Error> {
    [3.19954]
    [3.20011]
    fn try_into(self) -> Result<SeriesMetaData, Self::Error> {
  • edit in src/build_spec.rs at line 1052
    [3.62006]
    [3.62006]
    ///
  • edit in src/build_spec.rs at line 1054
    [3.62032]
    [3.62032]
    ///
  • edit in src/build_spec.rs at line 1057
    [3.62061]
    [3.62061]
    ///
  • edit in src/build_spec.rs at line 1060
    [3.62087]
    [3.62087]
    ///