Completed first try at ts Json data-structure.

[?]
CrEcTsRjb1hHQjHuumqRfqdbVV4X58iLEubi4noaDPFa
Jul 21, 2021, 7:43 AM
5B2HBV3JTNBNJYEJ4BXFQDEP2D552SBJFPY6STKSK7SPFZYSTCFAC

Dependencies

  • [2] TSY4YBBZ Changed ts Spec datastructures to new format.
  • [3] 2CCG6KUP Redo time-series spec.
  • [4] XI5ALEH6 Take advantage of keytree FromStr functionality.
  • [5] UKQAGL5F Checked ts_json toolchain.
  • [6] GUXZCEWW Added Country enum.
  • [7] TTR5IFSG Working on building generic TSSpec.
  • [8] K4CH53V4 Added GPL2 license, included missing source files.
  • [9] 4MG5JFXT First record.
  • [10] 77SIQZ3E Separating out spec generation.
  • [11] GQVS55HI Finished generate_ts_spec() function.
  • [12] YJXKWWM6 Added max() min() n GraphicJson and cleaned up serialization
  • [13] SAHJYVNB Removed checking functionality.
  • [14] SPSFTMLR Completed loading ts_data from specification.
  • [15] UUD3CJZL Making error handling more comprehensive.
  • [16] 2SABVMY3 Finished into_json() functionality.

Change contents

  • edit in src/ts.rs at line 3
    [3.1023]
    [3.0]
    use std::collections::BTreeMap;
  • replacement in src/ts.rs at line 11
    [3.7678][2.15:110]()
    // use serde::{
    // Serialize,
    // Serializer,
    // };
    // use serde::ser::SerializeStruct;
    [3.7678]
    [3.7700]
    use serde::{
    Serialize,
    Serializer,
    };
    use serde::ser::SerializeStruct;
  • replacement in src/ts.rs at line 26
    [3.7907][2.174:228]()
    // use time_series::{
    // RegularTimeSeries,
    // };
    [3.7907]
    [3.7907]
    use time_series::{
    RegularTimeSeries,
    };
  • edit in src/ts.rs at line 32
    [3.5280][3.1072:1092]()
    data_from_file,
  • replacement in src/ts.rs at line 36
    [3.312][3.1093:1113]()
    meta_from_file,
    [3.312]
    [3.5294]
    SeriesSpec,
  • edit in src/ts.rs at line 42
    [3.2014]
    [3.4815]
    #[derive(Debug)]
    pub struct Json(BTreeMap<(Country, DataType, usize), Vec<GraphicJson>>);
    #[derive(Debug, Serialize)]
    pub struct GraphicJson {
    title_opt: Option<String>,
    graphics: Vec<SeriesJson>,
    text_spec: TextSpec,
    }
    #[derive(Debug, Serialize)]
    pub struct SeriesJson {
    rts: RegularTimeSeries<1>,
    meta: Option<SeriesMetaData>,
    transforms: Vec<Transform>,
    }
  • replacement in src/ts.rs at line 61
    [3.4916][3.4916:5320]()
    /// Time-series specification.
    /// ```
    /// ts_spec:
    /// page:
    /// country: Australia
    /// data_type: u
    /// index: 0
    /// graphic:
    /// series:
    /// data_type: u
    /// series_id: AUSURAMS
    /// series:
    /// data_type: u
    /// series_id: AUSURANAA
    /// ```
    [3.4916]
    [2.229]
    #[derive(Debug)]
  • edit in src/ts.rs at line 85
    [3.7648]
    [3.9460]
    }
    pub (crate) fn into_json(&self, root_path: &str) -> Result<Json, Error> {
    let mut json = BTreeMap::new();
    for page_spec in &self.0 {
    let PageSpec {
    country,
    data_type,
    index,
    seriess,
    graphics,
    } = page_spec;
    // Iterate over graphics.
    let mut v: Vec<GraphicJson> = Vec::new();
    for graphic_spec in graphics {
    let GraphicSpec {
    title_opt,
    height_opt,
    series_ids,
    text_spec,
    ..
    } = graphic_spec;
    // Construct GraphicJson
    let t_opt = match title_opt {
    Some(title_opt) => Some(title_opt.clone()),
    None => None,
    };
    let mut graphic_json = GraphicJson {
    title_opt: t_opt,
    graphics: Vec::new(),
    text_spec: graphic_spec.text_spec,
    };
    for series_id in series_ids {
    graphic_json.graphics.push(page_spec.into_series_json(series_id, *country, root_path)?);
    }
    // Push GraphicJson to temporary Vec.
    v.push(graphic_json);
    }
    // Push key and value to json
    json.insert((country, data_type, index), v);
    }
    Ok(Json(BTreeMap::new()))
  • edit in src/ts.rs at line 183
    [3.6525]
    [3.8451]
    #[derive(Debug)]
  • edit in src/ts.rs at line 185
    [3.8473][2.532:540]()
    ///
  • edit in src/ts.rs at line 186
    [2.569][2.569:577]()
    ///
  • edit in src/ts.rs at line 187
    [2.607][3.8599:8607](),[3.10214][3.8599:8607]()
    ///
  • replacement in src/ts.rs at line 188
    [2.635][2.635:688]()
    ///
    pub series: Vec<SeriesSpec>,
    ///
    [2.635]
    [2.688]
    pub seriess: BTreeMap<SeriesId, SeriesSpec>,
  • edit in src/ts.rs at line 192
    [3.3039]
    [3.8823]
    impl PageSpec {
    pub (crate) fn into_series_json(
    &self,
    series_id: &SeriesId,
    country: Country,
    root_path: &str) -> Result<SeriesJson, Error>
    {
    let series_spec = match self.seriess.get(&series_id) {
    Some(series) => series,
    None => {
    return Err(
    failed_to_reference_series(
    file!(),
    line!(),
    &series_id.to_string() ,
    )
    )
    }
    };
    let rts = series_spec.data_with_transforms()?;
    let meta = series_spec.meta(country, root_path);
    Ok(
    SeriesJson {
    rts: rts,
    meta: Some(meta),
    transforms: series_spec.transforms.clone(),
    }
    )
    }
    }
  • edit in src/ts.rs at line 228
    [3.8965]
    [3.3347]
    let seriess_vec: Vec<SeriesSpec> = self.vec_at("page::series")?;
    let mut map = BTreeMap::new();
    for series_spec in seriess_vec {
    map.insert(series_spec.series_id.clone(), series_spec);
    }
  • replacement in src/ts.rs at line 240
    [3.9164][3.492:550]()
    series: self.vec_at("page::series")?,
    [3.9164]
    [3.9164]
    seriess: map,
  • replacement in src/ts.rs at line 254
    [2.1037][2.1037:1074]()
    for series in &self.series {
    [2.1037]
    [2.1074]
    for (_, series) in self.seriess.iter() {
  • edit in src/ts.rs at line 258
    [2.1134]
    [2.1134]
  • edit in src/ts.rs at line 267
    [3.604]
    [3.604]
    #[derive(Copy, Clone, Debug, Serialize)]
  • edit in src/ts.rs at line 269
    [3.624][3.624:681]()
    /// Specifies that graphic displays Links to series.
  • edit in src/ts.rs at line 270
    [3.691][3.691:742]()
    /// Specifies that graphics displays metadata.
  • edit in src/ts.rs at line 271
    [3.752][3.752:805]()
    /// Specifies that graphics do not display text.
  • edit in src/ts.rs at line 318
    [3.9448]
    [3.9448]
    #[derive(Debug)]
  • replacement in src/ts.rs at line 320
    [3.9473][2.1861:2038]()
    ///
    pub title: Option<String>,
    ///
    pub height: Option<f32>,
    ///
    pub series_id: Vec<SeriesId>,
    ///
    pub fid: Vec<String>,
    ///
    [3.9473]
    [2.2038]
    pub title_opt: Option<String>,
    pub height_opt: Option<f32>,
    pub series_ids: Vec<SeriesId>,
  • replacement in src/ts.rs at line 332
    [3.1845][3.1845:2116]()
    title: self.opt_value("graphic::title")?,
    height: self.opt_value("graphic::height")?,
    series_id: self.vec_value("graphic::series_id")?,
    fid: self.vec_value("graphic::fid")?,
    [3.1845]
    [2.2069]
    title_opt: self.opt_value("graphic::title")?,
    height_opt: self.opt_value("graphic::height")?,
    series_ids: self.vec_value("graphic::series_id")?,
  • replacement in src/ts.rs at line 346
    [3.7063][2.2289:2332]()
    if let Some(title) = &self.title {
    [3.7063]
    [2.2332]
    if let Some(title) = &self.title_opt {
  • replacement in src/ts.rs at line 350
    [2.2389][2.2389:2429]()
    if let Some(h) = &self.height {
    [2.2389]
    [2.2429]
    if let Some(h) = &self.height_opt {
  • replacement in src/ts.rs at line 354
    [2.2483][2.2483:2526]()
    for series_id in &self.series_id {
    [2.2483]
    [2.2526]
    for series_id in &self.series_ids {
  • edit in src/ts.rs at line 356
    [2.2580][2.2580:2663]()
    }
    for fid in &self.fid {
    kt.push_value(1, "fid", fid)
  • edit in src/ts.rs at line 363
    [2.2745][3.10062:10206](),[3.7063][3.10062:10206](),[3.10206][3.7109:7121](),[3.7109][3.7109:7121](),[3.7121][3.10207:10258](),[3.10258][3.7177:7185](),[3.7177][3.7177:7185](),[3.7185][3.2179:2196](),[3.2196][3.10259:10283](),[3.7185][3.10259:10283](),[3.10283][2.2746:2946](),[2.2946][3.7479:7482](),[3.7479][3.7479:7482](),[3.7482][3.10334:10384](),[3.10384][3.7534:7568](),[3.7534][3.7534:7568](),[3.7568][3.10385:10447](),[3.10447][3.2548:2744](),[3.2744][3.7629:7641](),[3.10447][3.7629:7641](),[3.7629][3.7629:7641](),[3.7641][3.2745:3048](),[3.2243][3.11011:11035](),[3.3048][3.11011:11035](),[3.7790][3.11011:11035](),[3.11011][3.11011:11035](),[3.8099][3.8099:8105](),[3.8105][3.3049:3051](),[3.3051][2.2947:3213](),[2.3213][3.3051:3052](),[3.3051][3.3051:3052](),[3.3052][2.3214:3670]()
    // This is differentiated from lib::SeriesSpec in that is is just for interacting with
    //
    /// Component of time-series specification.
    /// ```
    /// series:
    /// data_type: u
    /// series_id: AUSURAMS
    /// ```
    #[derive(Debug)]
    pub struct SeriesSpec {
    ///
    pub data_type: DataType,
    ///
    pub series_id: SeriesId,
    ///
    pub date_range: DateRange,
    ///
    pub transforms: Vec<Transform>,
    ///
    pub fid: Option<FID>,
    }
    impl<'a> TryInto<SeriesSpec> for KeyTreeRef<'a> {
    type Error = keytree::Error;
    fn try_into(self) -> Result<SeriesSpec, keytree::Error> {
    let first_date = self.opt_value("series::first_date")?;
    let last_date = self.opt_value("series::last_date")?;
    let date_range = DateRange::new(&first_date, &last_date);
    Ok(
    SeriesSpec {
    data_type: self.value("series::data_type")?,
    series_id: self.value("series::series_id")?,
    date_range,
    transforms: self.vec_value("series::transform")?,
    fid: self.opt_value("series::fid")?,
    }
    )
    }
    }
    impl IntoKeyTree for SeriesSpec {
    fn keytree(&self) -> KeyTreeString {
    let mut kt = KeyTreeString::new();
    kt.push_key(0, "series");
    kt.push_value(1, "data_type", &self.data_type);
    kt.push_value(1, "series_id", &self.series_id);
    if let Some(first_date) = self.date_range.first_date() {
    kt.push_value(1, "first_date", first_date);
    }
    if let Some(last_date) = self.date_range.last_date() {
    kt.push_value(1, "last_date", last_date);
    };
    for f in &self.transforms {
    kt.push_value(1, "f", f);
    }
    if let Some(fid) = &self.fid {
    kt.push_value(1, "fid", fid);
    }
    kt
    }
    }
  • replacement in src/ts.rs at line 366
    [3.3216][3.3216:3233]()
    #[derive(Debug)]
    [3.3216]
    [3.3233]
    #[derive(Copy, Clone, Debug, Serialize)]
  • replacement in src/ts.rs at line 392
    [2.3790][2.3790:3989](),[2.3989][3.3750:3831](),[3.3750][3.3750:3831](),[3.3831][3.8109:8110](),[3.8109][3.8109:8110](),[3.8110][3.3832:4252]()
    Transform::ToMonthly => write!(f, "to_monthly"),
    Transform::ToQuarterly => write!(f, "to_quarterly"),
    Transform::YearOnYear => write!(f, "yoy"),
    }
    }
    }
    /// SeriesIdentifierAfterTransform
    #[derive(Debug)]
    pub struct FID(String);
    impl FID {
    pub (crate) fn new(series_id: &SeriesId, f: Vec<Transform>) -> Self {
    let mut s = format!(
    "{}_",
    series_id,
    );
    for transform in f {
    match transform {
    Transform::ToMonthly => { s.push('m') },
    Transform::ToQuarterly => { s.push('q') },
    Transform::YearOnYear => { s.push('y') },
    }
    [2.3790]
    [3.4252]
    Transform::ToMonthly => write!(f, "to_monthly"),
    Transform::ToQuarterly => write!(f, "to_quarterly"),
    Transform::YearOnYear => write!(f, "yoy"),
  • edit in src/ts.rs at line 396
    [3.4262][3.4262:4277]()
    FID(s)
  • edit in src/ts.rs at line 398
    [3.4285][3.11144:11145](),[3.11144][3.11144:11145](),[3.11145][3.4286:4331](),[3.4331][3.10473:10478](),[3.11145][3.10473:10478](),[3.10478][3.4332:4427](),[3.4427][2.3990:4122]()
    impl FromStr for FID {
    type Err = Error;
    fn from_str(s: &str) -> Result<Self, Self::Err> {
    Ok(FID(String::from(s)))
    }
    }
    impl fmt::Display for FID {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
    write!(f, "{}", self.0)
    }
    }
  • edit in src/lib.rs at line 1
    [3.16][3.4811:4835]()
    #![deny(missing_docs)]
  • edit in src/lib.rs at line 205
    [2.4283]
    [2.4283]
    PageSpec,
  • edit in src/lib.rs at line 207
    [2.4297]
    [2.4297]
    Transform,
  • replacement in src/lib.rs at line 249
    [3.4737][3.4737:4754]()
    #[derive(Debug)]
    [3.4737]
    [3.4754]
    #[derive(Clone, Debug)]
  • replacement in src/lib.rs at line 434
    [3.4187][3.4187:4267]()
    match self.map.get_mut(&(series_spec.data_type, series_spec.country)) {
    [3.4187]
    [3.4267]
    // Expect country to be Some while building source.
    match self.map.get_mut(&(series_spec.data_type, series_spec.country.unwrap())) {
  • replacement in src/lib.rs at line 439
    [3.4323][3.4323:4389]()
    (series_spec.data_type, series_spec.country),
    [3.4323]
    [3.4389]
    // Expect country to be Some while building source.
    (series_spec.data_type, series_spec.country.unwrap()),
  • replacement in src/lib.rs at line 446
    [3.4543][3.4543:4609]()
    (series_spec.data_type, series_spec.country),
    [3.4543]
    [3.4609]
    // Expect country to be Some while building source.
    (series_spec.data_type, series_spec.country.unwrap()),
  • replacement in src/lib.rs at line 455
    [3.4810][3.4810:4876]()
    (series_spec.data_type, series_spec.country),
    [3.4810]
    [3.4876]
    // Expect country to be Some while building source.
    (series_spec.data_type, series_spec.country.unwrap()),
  • replacement in src/lib.rs at line 469
    [3.5133][2.4681:4728]()
    let mut page_spec = ts::PageSpec {
    [3.5133]
    [2.4728]
    let mut page_spec = PageSpec {
  • replacement in src/lib.rs at line 473
    [2.4837][2.4837:4877]()
    series: Vec::new(),
    [2.4837]
    [2.4877]
    seriess: BTreeMap::new(),
  • replacement in src/lib.rs at line 478
    [2.4990][2.4990:5138]()
    title: None,
    height: None,
    series_id: Vec::new(),
    fid: Vec::new(),
    [2.4990]
    [2.5138]
    title_opt: None,
    height_opt: None,
    series_ids: Vec::new(),
  • replacement in src/lib.rs at line 488
    [2.5296][2.5296:5350]()
    let ts_series_spec = ts::SeriesSpec {
    [2.5296]
    [2.5350]
    let ts_series_spec = SeriesSpec {
    country: None,
  • replacement in src/lib.rs at line 494
    [2.5590][2.5590:5632]()
    fid: None,
    [2.5590]
    [2.5632]
    drop_first: series_spec.drop_first,
  • replacement in src/lib.rs at line 499
    [2.5679][2.5679:5734]()
    page_spec.series.push(ts_series_spec);
    [2.5679]
    [2.5734]
    page_spec.seriess.insert(series_spec.series_id.clone(), ts_series_spec);
  • replacement in src/lib.rs at line 504
    [2.5840][2.5840:6030]()
    title: None,
    height: None,
    series_id: vec!(series_spec.series_id.clone()),
    fid: Vec::new(),
    [2.5840]
    [2.6030]
    title_opt: None,
    height_opt: None,
    series_ids: vec!(series_spec.series_id.clone()),
  • replacement in src/lib.rs at line 514
    [2.6197][2.6197:6277]()
    collated_graphic.series_id.push(series_spec.series_id.clone());
    [2.6197]
    [2.6277]
    collated_graphic.series_ids.push(series_spec.series_id.clone());
  • replacement in src/lib.rs at line 673
    [3.7852][3.7852:7857]()
    ///
    [3.7852]
    [3.17073]
    // We conflate both FRED-facing series and client-facing series. The reason for this is so that
    // the time_series() functionality is in one place. The down-side is that we need to make
    // the transforms optional, as they are not used in FRED-facing functionality, and
    // the country field optional as it is specified at a higher level in JsonSpec.
  • replacement in src/lib.rs at line 679
    [3.7898][3.7898:7906]()
    ///
    [3.7898]
    [3.7906]
    pub country: Option<Country>,
  • edit in src/lib.rs at line 681
    [3.7940][3.7940:7989]()
    ///
    pub country: Country,
    ///
  • replacement in src/lib.rs at line 682
    [3.8023][3.8023:8031]()
    ///
    [3.8023]
    [3.8031]
    pub date_range: DateRange,
    pub transforms: Vec<Transform>,
  • edit in src/lib.rs at line 688
    [3.8091]
    [3.1252]
    // We pass country because `series_spec.country` is None.
    /// Return the meta data for a `SeriesSpec`.
    pub fn meta(&self, country: Country, root_path: &str) -> SeriesMetaData
    {
    let path = data_path(
    root_path,
    self.data_type,
    country,
    self.series_id.clone(),
    "meta"
    );
    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/lib.rs at line 706
    [3.1253]
    [3.17098]
  • replacement in src/lib.rs at line 713
    [3.17292][3.17292:17318]()
    self.country,
    [3.17292]
    [3.17318]
    // Expect country to be Some while building source.
    self.country.unwrap(),
  • replacement in src/lib.rs at line 722
    [3.17471][3.17471:17497]()
    self.country,
    [3.17471]
    [3.17497]
    // Expect country to be Some while building source.
    self.country.unwrap(),
  • edit in src/lib.rs at line 760
    [3.2027]
    [3.2027]
    }
    }
    pub fn data_with_transforms(&self) -> Result<RegularTimeSeries<1>, Error> {
    let mut rts = self.data_without_transform()?;
    // Do transforms before constraining dates.
    for transform in &self.transforms {
    match transform {
    Transform::ToMonthly => rts.to_monthly(0),
    Transform::ToQuarterly => rts.to_quarterly(0),
    Transform::YearOnYear => {
    match rts.to_year_on_year(0) {
    Ok(rts) => rts,
    Err(err) => {
    return Err(
    keytree_error(
    file!(),
    line!(),
    &err.to_string(),
    )
    )
    },
    }
    }
    };
  • edit in src/lib.rs at line 790
    [3.2037]
    [3.2037]
    rts.with_range(&self.date_range.0);
    Ok(rts)
  • edit in src/lib.rs at line 793
    [3.2043]
    [3.8091]
  • replacement in src/lib.rs at line 796
    [3.17989][3.17989:18065]()
    pub fn into_time_series(&self) -> Result<RegularTimeSeries<1>, Error> {
    [3.17989]
    [3.18065]
    pub fn data_without_transform(&self) -> Result<RegularTimeSeries<1>, Error> {
  • replacement in src/lib.rs at line 829
    [3.19169][3.19169:19220]()
    &self.country.to_string(),
    [3.19169]
    [3.19220]
    // Expect country to be Some while building source.
    &self.country.unwrap().to_string(),
  • replacement in src/lib.rs at line 857
    [3.20064][3.20064:20111]()
    &self.country.to_string(),
    [3.20064]
    [3.20111]
    // Expect country to be Some while building source.
    &self.country.unwrap().to_string(),
  • replacement in src/lib.rs at line 885
    [3.9223][3.20853:20897]()
    let rts = self.into_time_series()?;
    [3.9223]
    [3.2044]
    let rts = self.data_without_transform()?;
  • replacement in src/lib.rs at line 908
    [3.9959][3.9959:9995]()
    self.country.as_path(),
    [3.9959]
    [3.9995]
    // Expect country to be Some while building source.
    self.country.unwrap().as_path(),
  • replacement in src/lib.rs at line 972
    [3.11433][3.11433:11469]()
    self.country.as_path(),
    [3.11433]
    [3.11469]
    // Expect country to be Some while building source.
    self.country.unwrap().as_path(),
  • edit in src/lib.rs at line 992
    [3.11886]
    [3.11886]
  • edit in src/lib.rs at line 994
    [3.11920]
    [3.11920]
    if let Some(country) = self.country {
    kt.push_value(1, "country", country);
    };
  • replacement in src/lib.rs at line 1000
    [3.11976][3.11976:12028]()
    kt.push_value(1, "country", &self.country);
    [3.11976]
    [3.12028]
  • replacement in src/lib.rs at line 1002
    [3.12084][3.12084:12145]()
    kt.push_opt_value(1, "drop_first", self.drop_first);
    [3.12084]
    [3.12145]
    if let Some(first_date) = self.date_range.first_date() {
    kt.push_value(1, "first_date", first_date);
    }
    if let Some(last_date) = self.date_range.last_date() {
    kt.push_value(1, "last_date", last_date);
    };
    for f in &self.transforms {
    kt.push_value(1, "f", f);
    }
    if let Some(drop) = &self.drop_first {
    kt.push_value(1, "drop_first", drop);
    }
  • edit in src/lib.rs at line 1026
    [3.12311]
    [3.12311]
    let first_date = self.opt_value("series::first_date")?;
    let last_date = self.opt_value("series::last_date")?;
  • edit in src/lib.rs at line 1032
    [3.12347]
    [3.12347]
    country: self.opt_value("series::country")?,
  • edit in src/lib.rs at line 1034
    [3.12410][3.12410:12470]()
    country: self.value("series::country")?,
  • edit in src/lib.rs at line 1035
    [3.12532]
    [3.12532]
    date_range: DateRange::new(&first_date, &last_date),
    transforms: self.vec_value("series::transforms")?,
  • edit in src/lib.rs at line 1130
    [3.15547][3.22301:23902](),[3.23902][3.6576:6577]()
    /// Read csv data from file and return a time-series.
    pub fn data_from_file(
    country: Country,
    data_type: DataType,
    series_id: SeriesId,
    root_path: &str) -> Result<RegularTimeSeries<1>, Error>
    {
    let path = data_path(
    root_path,
    data_type,
    country,
    series_id.clone(),
    "csv"
    );
    match TimeSeries::<1>::from_csv(&path) {
    Ok(ts) => {
    match ts.try_into() {
    Ok(rts) => Ok(rts),
    Err(err) => {
    Err(time_series_from_csv_failed(
    file!(),
    line!(),
    &data_type.to_string(),
    &country.to_string(),
    &series_id.to_string(),
    &err.to_string(),
    ))
    },
    }
    },
    Err(err) => Err(time_series_from_csv_failed(
    file!(),
    line!(),
    &data_type.to_string(),
    &country.to_string(),
    &series_id.to_string(),
    &err.to_string(),
    ))
    }
    }
    /// Return the meta data for a `SeriesSpec`.
    pub fn meta_from_file(
    country: Country,
    data_type: DataType,
    series_id: SeriesId,
    root_path: &str) -> SeriesMetaData
    {
    let path = data_path(
    root_path,
    data_type,
    country,
    series_id.clone(),
    "meta"
    );
    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/fred.rs at line 17
    [3.6396]
    [3.6396]
    DateRange,
  • replacement in src/fred.rs at line 115
    [3.9287][3.9287:9345]()
    country: tag_selector.country,
    [3.9287]
    [3.9345]
    country: Some(tag_selector.country),
  • edit in src/fred.rs at line 117
    [3.9392]
    [3.9392]
    date_range: DateRange::new(&None, &None),
    transforms: Vec::new(),
  • edit in src/fred.rs at line 168
    [3.11064]
    [3.11064]
    country: Some(tag_selector.country),
  • edit in src/fred.rs at line 170
    [3.11124][3.11124:11182]()
    country: tag_selector.country,
  • edit in src/fred.rs at line 171
    [3.11229]
    [3.11229]
    date_range: DateRange::new(&None, &None),
    transforms: Vec::new(),
  • replacement in src/error.rs at line 89
    [3.16197][3.16197:16201]()
    ///
    [3.16197]
    [3.16201]
    pub fn failed_to_reference_series(
    code_file: &str,
    code_line: u32,
    series_id: &str) -> Error
    {
    Error(format!(
    "[ui_date:06:{}:{}] Could not find graphic reference [{}] in series.",
    code_file,
    code_line,
    series_id,
    ))
    }
  • edit in src/error.rs at line 127
    [3.16628][3.16628:16632]()
    ///
  • edit in src/error.rs at line 140
    [3.16844][3.16844:16848]()
    ///