lib_ria/database/
material.rs

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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
use serde::{Deserialize, Serialize};

#[derive(Serialize, Deserialize, Debug)]
#[serde(tag = "type")]
pub enum Data {
    #[serde(rename = "tabulated k")]
    TabulatedK { data: String },

    #[serde(rename = "tabulated n")]
    TabulatedN { data: String },

    #[serde(rename = "tabulated nk")]
    TabulatedNK { data: String },

    #[serde(rename = "formula 1")]
    Formula1 {
        wavelength_range: String,
        coefficients: String,
    },

    #[serde(rename = "formula 2")]
    Formula2 {
        wavelength_range: String,
        coefficients: String,
    },

    #[serde(rename = "formula 3")]
    Formula3 {
        wavelength_range: String,
        coefficients: String,
    },

    #[serde(rename = "formula 4")]
    Formula4 {
        wavelength_range: String,
        coefficients: String,
    },

    #[serde(rename = "formula 5")]
    Formula5 {
        wavelength_range: String,
        coefficients: String,
    },

    #[serde(rename = "formula 6")]
    Formula6 {
        wavelength_range: String,
        coefficients: String,
    },

    #[serde(rename = "formula 7")]
    Formula7 {
        wavelength_range: String,
        coefficients: String,
    },

    #[serde(rename = "formula 8")]
    Formula8 {
        wavelength_range: String,
        coefficients: String,
    },

    #[serde(rename = "formula 9")]
    Formula9 {
        wavelength_range: String,
        coefficients: String,
    },
}

#[derive(Serialize, Deserialize, Debug)]
pub struct Material {
    #[serde(rename = "REFERENCES")]
    pub references: String,

    #[serde(rename = "COMMENTS")]
    pub comments: String,

    #[serde(rename = "DATA")]
    pub data: Vec<Data>,

    #[serde(rename = "SPECS")]
    pub specs: Option<serde_yaml::Value>,
}

#[cfg(test)]
mod test {
    use super::*;

    fn yaml() -> &'static str {
        r#"
        REFERENCES: \"<a href=\"http://refractiveindex.info/download/data/2017/schott_2017-01-20b.agf\">SCHOTT Zemax catalog 2017-01-20b</a> (obtained from <a href=\"http://www.schott.com/advanced_optics/english/download/\">http://www.schott.com</a>)<br>See also <a href=\"http://refractiveindex.info/download/data/2017/schott_2017-01-20.pdf\">SCHOTT glass data sheets</a>\"
        COMMENTS: \"lead containing glass type\"
        DATA:
          - type: formula 2 
            wavelength_range: 0.37 2.5
            coefficients: 0 1.70579259 0.0133874699 0.344223052 0.0579561608 1.09601828 121.616024
          - type: tabulated k
            data: |
                0.370 5.4237E-06
                0.380 2.7852E-06
                0.390 1.1068E-06
        SPECS:
            n_is_absolute: false
            wavelength_is_vacuum: false
            temperature: 20.0 °C
            thermal_dispersion:
              - type: "Schott formula"
                coefficients: 6.02e-06 1.7e-08 -2.61e-11 1.63e-06 1.59e-09 0.269
            nd: 1.7847
            Vd: 26.08
            glass_code: 785261.492
            glass_status: standard
            density: 4.92 g/cm<sup>3</sup>
            thermal_expansion:
              - temperature_range: -30 70 °C
                coefficient: 7.9e-06 K<sup>-1</sup>
              - temperature_range: 20 300 °C
                coefficient: 8.8e-06 K<sup>-1</sup>
            dPgF: 0.0098
            climatic_resistance: 1.0
            stain_resistance: 1.0
            acid_resistance: 3.2
            alkali_resistance: 2.2
            phosphate_resistance: 3.2
        "#
    }

    #[test]
    fn test_deserialize_material() {
        let _: Material = serde_yaml::from_str(yaml()).unwrap();
    }
}