1use serde::{Deserialize, Serialize};
2
3use crate::boring_structs_210::*;
5use crate::classification::{ClassificationInfo, Constituent, RockGroupCode, RockGroupInfo};
6use crate::types::FreeInfo;
7
8#[derive(Debug, Serialize, Deserialize)]
13#[serde(rename = "ボーリング情報")]
14pub struct Boring300 {
15 #[serde(rename = "@DTD_version")]
16 pub dtd_version: Option<String>,
17 #[serde(rename = "標題情報")]
18 pub title: Title300,
19 #[serde(rename = "コア情報")]
20 pub core: Core300,
21}
22
23#[derive(Debug, Serialize, Deserialize)]
28pub struct Title300 {
29 #[serde(rename = "調査基本情報")]
30 pub basic_info: BasicSurvey300,
31 #[serde(rename = "経度緯度情報")]
32 pub longitude_latitude: LngLat210,
33 #[serde(default, rename = "ローカル座標")]
34 pub local_coordinates: Vec<LocalCoordinate210>,
35 #[serde(rename = "調査位置")]
36 pub survey_position: SurveyPosition210,
37 #[serde(rename = "発注機関")]
38 pub order_institution: OrderInstitution210,
39 #[serde(rename = "調査期間")]
40 pub survey_period: SurveyPeriod210,
41 #[serde(rename = "調査会社")]
42 pub survey_company: SurveyCompany210,
43 #[serde(rename = "ボーリング基本情報")]
44 pub boring_basic_info: BoringBasicInfo210,
45 #[serde(rename = "試錐機")]
46 pub drilling_machine: DrillingMachine210,
47 #[serde(rename = "エンジン")]
48 pub engine: Engine210,
49 #[serde(default, rename = "ハンマー落下用具")]
50 pub hammer_drop_tool: Option<HammerDropTool210>,
51 #[serde(default, rename = "N値記録用具")]
52 pub n_value_recorder: Option<NValueRecorder210>,
53 #[serde(rename = "ポンプ")]
54 pub pump: Pump210,
55 #[serde(default, rename = "櫓種類")]
56 pub tower_type: Option<TowerType210>,
57}
58
59#[derive(Debug, Serialize, Deserialize)]
64pub struct BasicSurvey300 {
65 #[serde(default, rename = "事業工事名")]
66 pub project_name: Option<String>,
67 #[serde(rename = "調査名")]
68 pub survey_name: Option<String>,
69 #[serde(rename = "調査目的")]
70 pub survey_purpose: Option<String>,
71 #[serde(rename = "調査対象")]
72 pub survey_target: Option<String>,
73 #[serde(rename = "ボーリング名")]
74 pub boring_name: Option<String>,
75 #[serde(rename = "ボーリング総数")]
76 pub total_boring: Option<String>,
77 #[serde(rename = "ボーリング連番")]
78 pub boring_serial: Option<String>,
79}
80
81#[derive(Debug, Serialize, Deserialize)]
86pub struct Core300 {
87 #[serde(rename = "岩石土区分")] pub rock_soil_classifications: Vec<RockSoilClassification300>,
89 #[serde(default, rename = "色調")]
90 pub colors: Vec<Color210>,
91 #[serde(default, rename = "観察記事")]
92 pub observational_articles: Vec<ObservationalArticle210>,
93 #[serde(default, rename = "観察記事枠線")]
94 pub observational_article_frames: Vec<ObservationalArticleFrame210>,
95 #[serde(default, rename = "標準貫入試験")]
96 pub standard_penetration_tests: Vec<StandardPenetrationTest210>,
97 #[serde(default, rename = "標準貫入試験詳細データ")]
98 pub standard_penetration_test_details: Vec<StandardPenetrationTestDetail210>,
99 #[serde(default, rename = "ルジオン試験")]
100 pub lugeon_tests: Vec<LugeonTest210>,
101 #[serde(default, rename = "ルジオン試験詳細データ")]
102 pub lugeon_test_details: Vec<LugeonTestDetail210>,
103 #[serde(default, rename = "相対密度稠度")]
104 pub relative_density_consistency: Vec<RelativeDensityConsistency210>,
105 #[serde(default, rename = "硬軟区分判定表")]
106 pub hardness_classification_table: Vec<HardnessClassificationTable210>,
107 #[serde(default, rename = "硬軟区分")]
108 pub hardness_classifications: Vec<HardnessClassification300>, #[serde(default, rename = "コア形状区分判定表")]
110 pub core_shape_classification_table: Vec<CoreShapeClassificationTable210>,
111 #[serde(default, rename = "コア形状区分")]
112 pub core_shape_classifications: Vec<CoreShapeClassification300>, #[serde(default, rename = "割れ目区分判定表")]
114 pub fracture_classification_table: Vec<FractureClassificationTable210>,
115 #[serde(default, rename = "割れ目区分")]
116 pub fracture_classifications: Vec<FractureClassification300>, #[serde(default, rename = "風化区分判定表")]
118 pub weathering_classification_table: Vec<WeatheringClassificationTable210>,
119 #[serde(default, rename = "風化区分")]
120 pub weathering_classifications: Vec<WeatheringClassification300>, #[serde(default, rename = "変質区分判定表")]
122 pub alteration_classification_table: Vec<AlterationClassificationTable210>,
123 #[serde(default, rename = "変質区分")]
124 pub alteration_classifications: Vec<AlterationClassification300>, #[serde(default, rename = "孔内水平載荷試験")]
126 pub borehole_horizontal_load_tests: Vec<BoreholeHorizontalLoadTest210>,
127 #[serde(default, rename = "透水試験")]
128 pub permeability_tests: Vec<PermeabilityTest210>,
129 #[serde(default, rename = "P波試験")]
130 pub p_wave_tests: Vec<PWaveTest210>,
131 #[serde(default, rename = "S波試験")]
132 pub s_wave_tests: Vec<SWaveTest210>,
133 #[serde(default, rename = "その他原位置試験")]
134 pub other_in_situ_tests: Vec<OtherInSituTest210>,
135 #[serde(default, rename = "試料採取")]
136 pub sample_collections: Vec<SampleCollection210>,
137 #[serde(default, rename = "地盤材料の工学的分類")]
138 pub ground_material_classifications: Vec<GroundMaterialClassification210>,
139 #[serde(default, rename = "地質時代")]
140 pub geological_ages: Vec<GeologicalAge300>, #[serde(default, rename = "地層岩体区分")]
142 pub stratum_rock_classifications: Vec<StratumRockClassification210>,
143 #[serde(default, rename = "孔内水位")]
144 pub borehole_water_levels: Vec<BoreholeWaterLevel210>,
145 #[serde(default, rename = "掘削工程")]
146 pub drilling_processes: Vec<DrillingProcess210>,
147 #[serde(default, rename = "孔径孔壁保護")]
148 pub borehole_diameter_protections: Vec<BoreholeDiameterProtection210>,
149 #[serde(default, rename = "掘進速度")]
150 pub drilling_speeds: Vec<DrillingSpeed210>,
151 #[serde(default, rename = "コアチューブビット")]
152 pub core_tube_bits: Vec<CoreTubeBit210>,
153 #[serde(default, rename = "給圧条件")]
154 pub pressure_conditions: Vec<PressureCondition210>,
155 #[serde(default, rename = "回転数")]
156 pub rotation_speeds: Vec<RotationSpeed210>,
157 #[serde(default, rename = "送水条件")]
158 pub water_supply_conditions: Vec<WaterSupplyCondition210>,
159 #[serde(default, rename = "断層破砕帯区分")]
160 pub fault_fracture_zone_classifications: Vec<FaultFractureZoneClassification210>,
161 #[serde(default, rename = "コア採取率")]
162 pub core_recovery_rates: Vec<CoreRecoveryRate300>, #[serde(default, rename = "最大コア長")]
164 pub maximum_core_lengths: Vec<MaximumCoreLength300>, #[serde(default, rename = "RQD")]
166 pub rqds: Vec<RQD210>,
167 #[serde(default, rename = "岩級区分判定表")]
168 pub rock_class_classification_table: Vec<RockClassClassificationTable210>,
169 #[serde(default, rename = "岩級区分")]
170 pub rock_class_classifications: Vec<RockClassClassification300>, #[serde(default, rename = "保孔管")]
172 pub casing_pipes: Vec<CasingPipe210>,
173 #[serde(default, rename = "計測機器")]
174 pub measuring_instruments: Vec<MeasuringInstrument210>,
175 #[serde(default, rename = "地下水検層試験")]
176 pub groundwater_logging_tests: Vec<GroundwaterLoggingTest210>,
177 #[serde(default, rename = "地下水検層試験詳細データ")]
178 pub groundwater_logging_test_details: Vec<GroundwaterLoggingTestDetail210>,
179 #[serde(default, rename = "地下水検層試験判定結果")]
180 pub groundwater_logging_test_results: Vec<GroundwaterLoggingTestResult210>,
181 #[serde(default, rename = "備考")]
182 pub remarks: Vec<Remark210>,
183 #[serde(default, rename = "フリー情報")]
184 pub free_info: Vec<FreeInfo>,
185}
186
187#[derive(Debug, Serialize, Deserialize)]
194pub struct RockSoilClassification300 {
195 #[serde(rename = "岩石土区分_下端深度")]
196 pub depth: Option<String>,
197 #[serde(rename = "岩石土区分_岩石土名")]
198 pub rock_soil_name: Option<String>,
199 #[serde(default, rename = "岩石土区分_岩石土記号")]
200 pub rock_soil_symbol: Option<String>,
201 #[serde(rename = "岩石土区分_岩石群")] pub rock_groups: Vec<RockGroup300>,
203}
204
205#[derive(Debug, Serialize, Deserialize)]
211pub struct RockGroup300 {
212 #[serde(rename = "岩石土区分_岩石群コード")]
213 pub rock_group_code: Option<String>,
214 #[serde(rename = "岩石土区分_岩石土コード")] pub rock_soil_codes: Vec<RockSoilCode300>,
216}
217
218#[derive(Debug, Serialize, Deserialize)]
225pub struct RockSoilCode300 {
226 #[serde(default, rename = "岩石土区分_岩相")]
227 pub lithofacies: Option<String>,
228 #[serde(default, rename = "岩石土区分_岩石")]
229 pub rock: Option<String>,
230 #[serde(default, rename = "岩石土区分_変成岩岩相")]
231 pub metamorphic_rock_lithofacies: Option<String>,
232 #[serde(default, rename = "岩石土区分_変成岩岩石")]
233 pub metamorphic_rock: Option<String>,
234}
235
236#[derive(Debug, Serialize, Deserialize)]
243pub struct GeologicalAge300 {
244 #[serde(rename = "地質時代_上端深度")]
245 pub start_depth: Option<String>,
246 #[serde(rename = "地質時代_下端深度")]
247 pub end_depth: Option<String>,
248 #[serde(rename = "地質時代_地質時代名")] pub geological_age_name: Option<String>,
250 #[serde(default, rename = "地質時代_形成年代上限")] pub formation_age_upper_limit: Option<String>,
252 #[serde(default, rename = "地質時代_形成年代下限")] pub formation_age_lower_limit: Option<String>,
254 #[serde(default, rename = "地質時代_変成年代上限")] pub metamorphic_age_upper_limit: Option<String>,
256 #[serde(default, rename = "地質時代_変成年代下限")] pub metamorphic_age_lower_limit: Option<String>,
258}
259
260#[derive(Debug, Serialize, Deserialize)]
266pub struct HardnessClassification300 {
267 #[serde(rename = "硬軟区分_下端深度")]
268 pub depth: Option<String>,
269 #[serde(default, rename = "硬軟区分_硬軟区分")] pub classification: Option<String>,
271}
272
273#[derive(Debug, Serialize, Deserialize)]
279pub struct CoreShapeClassification300 {
280 #[serde(rename = "コア形状区分_下端深度")]
281 pub depth: Option<String>,
282 #[serde(default, rename = "コア形状区分_コア形状区分")] pub classification: Option<String>,
284}
285
286#[derive(Debug, Serialize, Deserialize)]
292pub struct FractureClassification300 {
293 #[serde(rename = "割れ目区分_下端深度")]
294 pub depth: Option<String>,
295 #[serde(default, rename = "割れ目区分_割れ目区分")] pub classification: Option<String>,
297}
298
299#[derive(Debug, Serialize, Deserialize)]
305pub struct WeatheringClassification300 {
306 #[serde(rename = "風化区分_下端深度")]
307 pub depth: Option<String>,
308 #[serde(default, rename = "風化区分_風化区分")] pub classification: Option<String>,
310}
311
312#[derive(Debug, Serialize, Deserialize)]
318pub struct AlterationClassification300 {
319 #[serde(rename = "変質区分_下端深度")]
320 pub depth: Option<String>,
321 #[serde(default, rename = "変質区分_変質区分")] pub classification: Option<String>,
323}
324
325#[derive(Debug, Serialize, Deserialize)]
331pub struct CoreRecoveryRate300 {
332 #[serde(rename = "コア採取率_下端深度")]
333 pub depth: Option<String>,
334 #[serde(default, rename = "コア採取率_採取率")] pub recovery_rate: Option<String>,
336}
337
338#[derive(Debug, Serialize, Deserialize)]
344pub struct MaximumCoreLength300 {
345 #[serde(rename = "最大コア長_下端深度")]
346 pub depth: Option<String>,
347 #[serde(default, rename = "最大コア長_コア長")] pub core_length: Option<String>,
349}
350
351#[derive(Debug, Serialize, Deserialize)]
357pub struct RockClassClassification300 {
358 #[serde(rename = "岩級区分_下端深度")]
359 pub depth: Option<String>,
360 #[serde(default, rename = "岩級区分_岩級区分")] pub classification: Option<String>,
362}
363
364impl ClassificationInfo for RockSoilClassification300 {
369 fn rock_groups(&self) -> Vec<RockGroupInfo> {
370 self.rock_groups
371 .iter()
372 .map(|g| {
373 let code = g
374 .rock_group_code
375 .as_deref()
376 .and_then(RockGroupCode::from_code)
377 .unwrap_or(RockGroupCode::Single);
378
379 let constituents = g
380 .rock_soil_codes
381 .iter()
382 .map(|c| Constituent::Coded {
383 lithofacies: c.lithofacies.clone(),
384 rock: c.rock.clone(),
385 metamorphic_rock_lithofacies: c.metamorphic_rock_lithofacies.clone(),
386 metamorphic_rock: c.metamorphic_rock.clone(),
387 })
388 .collect();
389
390 RockGroupInfo { code, constituents }
391 })
392 .collect()
393 }
394}