• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

geo-engine / geoengine / 15465563032

05 Jun 2025 11:13AM UTC coverage: 89.513%. First build
15465563032

Pull #1050

github

web-flow
Merge 0eccaf7aa into c33c03865
Pull Request #1050: feat(services): provider management

788 of 1328 new or added lines in 17 files covered. (59.34%)

129686 of 144880 relevant lines covered (89.51%)

58222.58 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

28.62
/services/src/api/model/services.rs
1
use super::datatypes::{CacheTtlSeconds, DataId, DataProviderId, GdalConfigOption, RasterDataType};
2
use crate::api::model::operators::{
3
    GdalMetaDataList, GdalMetaDataRegular, GdalMetaDataStatic, GdalMetadataNetCdfCf, MockMetaData,
4
    OgrMetaData,
5
};
6
use crate::datasets::DatasetName;
7
use crate::datasets::external::GdalRetries;
8
use crate::datasets::storage::validate_tags;
9
use crate::datasets::upload::{UploadId, VolumeName};
10
use crate::projects::Symbology;
11
use crate::util::parsing::deserialize_base_url;
12
use geoengine_macros::type_tag;
13
use serde::{Deserialize, Serialize};
14
use std::path::PathBuf;
15
use url::Url;
16
use utoipa::ToSchema;
17
use validator::{Validate, ValidationErrors};
18

19
pub const SECRET_REPLACEMENT: &str = "*****";
20

21
#[allow(clippy::large_enum_variant)]
22
#[derive(Serialize, Deserialize, Debug, Clone, ToSchema, PartialEq)]
155✔
23
#[serde(untagged)]
24
#[schema(discriminator = "type")]
25
pub enum MetaDataDefinition {
26
    MockMetaData(MockMetaData),
27
    OgrMetaData(OgrMetaData),
28
    GdalMetaDataRegular(GdalMetaDataRegular),
29
    GdalStatic(GdalMetaDataStatic),
30
    GdalMetadataNetCdfCf(GdalMetadataNetCdfCf),
31
    GdalMetaDataList(GdalMetaDataList),
32
}
33

34
impl From<crate::datasets::storage::MetaDataDefinition> for MetaDataDefinition {
35
    fn from(value: crate::datasets::storage::MetaDataDefinition) -> Self {
4✔
36
        match value {
4✔
37
            crate::datasets::storage::MetaDataDefinition::MockMetaData(x) => {
×
38
                Self::MockMetaData(MockMetaData {
×
39
                    r#type: Default::default(),
×
40
                    loading_info: x.loading_info.into(),
×
41
                    result_descriptor: x.result_descriptor.into(),
×
42
                })
×
43
            }
44
            crate::datasets::storage::MetaDataDefinition::OgrMetaData(x) => {
4✔
45
                Self::OgrMetaData(OgrMetaData {
4✔
46
                    r#type: Default::default(),
4✔
47
                    loading_info: x.loading_info.into(),
4✔
48
                    result_descriptor: x.result_descriptor.into(),
4✔
49
                })
4✔
50
            }
51
            crate::datasets::storage::MetaDataDefinition::GdalMetaDataRegular(x) => {
×
52
                Self::GdalMetaDataRegular(x.into())
×
53
            }
54
            crate::datasets::storage::MetaDataDefinition::GdalStatic(x) => {
×
55
                Self::GdalStatic(x.into())
×
56
            }
57
            crate::datasets::storage::MetaDataDefinition::GdalMetadataNetCdfCf(x) => {
×
58
                Self::GdalMetadataNetCdfCf(x.into())
×
59
            }
60
            crate::datasets::storage::MetaDataDefinition::GdalMetaDataList(x) => {
×
61
                Self::GdalMetaDataList(x.into())
×
62
            }
63
        }
64
    }
4✔
65
}
66

67
impl From<MetaDataDefinition> for crate::datasets::storage::MetaDataDefinition {
68
    fn from(value: MetaDataDefinition) -> Self {
7✔
69
        match value {
7✔
70
            MetaDataDefinition::MockMetaData(x) => Self::MockMetaData(x.into()),
×
71
            MetaDataDefinition::OgrMetaData(x) => Self::OgrMetaData(x.into()),
3✔
72
            MetaDataDefinition::GdalMetaDataRegular(x) => Self::GdalMetaDataRegular(x.into()),
4✔
73
            MetaDataDefinition::GdalStatic(x) => Self::GdalStatic(x.into()),
×
74
            MetaDataDefinition::GdalMetadataNetCdfCf(x) => Self::GdalMetadataNetCdfCf(x.into()),
×
75
            MetaDataDefinition::GdalMetaDataList(x) => Self::GdalMetaDataList(x.into()),
×
76
        }
77
    }
7✔
78
}
79

80
#[derive(Deserialize, Serialize, ToSchema)]
35✔
81
#[serde(rename_all = "camelCase")]
82
pub struct MetaDataSuggestion {
83
    pub main_file: String,
84
    pub layer_name: String,
85
    pub meta_data: MetaDataDefinition,
86
}
87

88
#[derive(Debug, Serialize, Deserialize, Clone, ToSchema)]
55✔
89
#[serde(rename_all = "camelCase")]
90
// TODO: validate user input
91
pub struct AddDataset {
92
    pub name: Option<DatasetName>,
93
    pub display_name: String,
94
    pub description: String,
95
    pub source_operator: String,
96
    pub symbology: Option<Symbology>,
97
    pub provenance: Option<Vec<Provenance>>,
98
    pub tags: Option<Vec<String>>,
99
}
100

101
impl From<AddDataset> for crate::datasets::storage::AddDataset {
102
    fn from(value: AddDataset) -> Self {
11✔
103
        Self {
11✔
104
            name: value.name,
11✔
105
            display_name: value.display_name,
11✔
106
            description: value.description,
11✔
107
            source_operator: value.source_operator,
11✔
108
            symbology: value.symbology,
11✔
109
            provenance: value
11✔
110
                .provenance
11✔
111
                .map(|v| v.into_iter().map(Into::into).collect()),
11✔
112
            tags: value.tags,
11✔
113
        }
11✔
114
    }
11✔
115
}
116

117
impl From<crate::datasets::storage::AddDataset> for AddDataset {
118
    fn from(value: crate::datasets::storage::AddDataset) -> Self {
×
119
        Self {
×
120
            name: value.name,
×
121
            display_name: value.display_name,
×
122
            description: value.description,
×
123
            source_operator: value.source_operator,
×
124
            symbology: value.symbology,
×
125
            provenance: value
×
126
                .provenance
×
127
                .map(|v| v.into_iter().map(Into::into).collect()),
×
128
            tags: value.tags,
×
129
        }
×
130
    }
×
131
}
132

133
#[derive(Deserialize, Serialize, Debug, Clone, ToSchema)]
55✔
134
#[serde(rename_all = "camelCase")]
135
pub struct DatasetDefinition {
136
    pub properties: AddDataset,
137
    pub meta_data: MetaDataDefinition,
138
}
139

140
#[derive(Deserialize, Serialize, Debug, Clone, ToSchema)]
35✔
141
#[serde(rename_all = "camelCase")]
142
pub struct CreateDataset {
143
    pub data_path: DataPath,
144
    pub definition: DatasetDefinition,
145
}
146

147
#[derive(Deserialize, Serialize, Debug, Clone, ToSchema)]
95✔
148
#[serde(rename_all = "camelCase")]
149
pub enum DataPath {
150
    Volume(VolumeName),
151
    Upload(UploadId),
152
}
153

154
#[derive(Deserialize, Serialize, Debug, Clone, ToSchema, Validate)]
35✔
155
pub struct UpdateDataset {
156
    pub name: DatasetName,
157
    #[validate(length(min = 1))]
158
    pub display_name: String,
159
    pub description: String,
160
    #[validate(custom(function = "validate_tags"))]
161
    pub tags: Vec<String>,
162
}
163

164
#[derive(Deserialize, Serialize, PartialEq, Eq, Debug, Clone, ToSchema, Validate)]
255✔
165
pub struct Provenance {
166
    #[validate(length(min = 1))]
167
    pub citation: String,
168
    #[validate(length(min = 1))]
169
    pub license: String,
170
    #[validate(length(min = 1))]
171
    pub uri: String,
172
}
173

174
impl From<Provenance> for crate::datasets::listing::Provenance {
175
    fn from(value: Provenance) -> Self {
2✔
176
        Self {
2✔
177
            citation: value.citation,
2✔
178
            license: value.license,
2✔
179
            uri: value.uri,
2✔
180
        }
2✔
181
    }
2✔
182
}
183

184
impl From<crate::datasets::listing::Provenance> for Provenance {
185
    fn from(value: crate::datasets::listing::Provenance) -> Self {
×
186
        Self {
×
187
            citation: value.citation,
×
188
            license: value.license,
×
189
            uri: value.uri,
×
190
        }
×
191
    }
×
192
}
193

194
#[derive(Deserialize, Serialize, Debug, Clone, ToSchema)]
35✔
195
pub struct Provenances {
196
    pub provenances: Vec<Provenance>,
197
}
198

199
impl Validate for Provenances {
200
    fn validate(&self) -> Result<(), ValidationErrors> {
1✔
201
        for provenance in &self.provenances {
2✔
202
            provenance.validate()?;
1✔
203
        }
204
        Ok(())
1✔
205
    }
1✔
206
}
207

208
#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, ToSchema)]
10✔
209
pub struct ProvenanceOutput {
210
    pub data: DataId,
211
    pub provenance: Option<Vec<Provenance>>,
212
}
213

214
#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, ToSchema)]
25✔
215
pub struct Volume {
216
    pub name: String,
217
    pub path: Option<String>,
218
}
219

220
#[derive(Debug, Clone, PartialEq, Eq, ToSchema, Serialize)]
35✔
221
pub struct LayerProviderListing {
222
    pub id: DataProviderId,
223
    pub name: String,
224
    pub priority: i16,
225
}
226

227
impl From<crate::layers::storage::LayerProviderListing> for LayerProviderListing {
NEW
228
    fn from(value: crate::layers::storage::LayerProviderListing) -> Self {
×
NEW
229
        LayerProviderListing {
×
NEW
230
            id: value.id.into(),
×
NEW
231
            name: value.name,
×
NEW
232
            priority: value.priority,
×
NEW
233
        }
×
NEW
234
    }
×
235
}
236

237
#[type_tag(value = "Aruna")]
50✔
238
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, ToSchema)]
70✔
239
#[serde(rename_all = "camelCase")]
240
pub struct ArunaDataProviderDefinition {
241
    pub id: DataProviderId,
242
    pub name: String,
243
    pub description: String,
244
    pub priority: Option<i16>,
245
    pub api_url: String,
246
    pub project_id: String,
247
    pub api_token: String,
248
    pub filter_label: String,
249
    #[serde(default)]
250
    pub cache_ttl: CacheTtlSeconds,
251
}
252

253
impl From<ArunaDataProviderDefinition>
254
    for crate::datasets::external::aruna::ArunaDataProviderDefinition
255
{
256
    fn from(value: ArunaDataProviderDefinition) -> Self {
1✔
257
        crate::datasets::external::aruna::ArunaDataProviderDefinition {
1✔
258
            id: value.id.into(),
1✔
259
            name: value.name,
1✔
260
            description: value.description,
1✔
261
            priority: value.priority,
1✔
262
            api_url: value.api_url,
1✔
263
            project_id: value.project_id,
1✔
264
            api_token: value.api_token,
1✔
265
            filter_label: value.filter_label,
1✔
266
            cache_ttl: value.cache_ttl.into(),
1✔
267
        }
1✔
268
    }
1✔
269
}
270

271
impl From<crate::datasets::external::aruna::ArunaDataProviderDefinition>
272
    for ArunaDataProviderDefinition
273
{
274
    fn from(value: crate::datasets::external::aruna::ArunaDataProviderDefinition) -> Self {
1✔
275
        ArunaDataProviderDefinition {
1✔
276
            r#type: Default::default(),
1✔
277
            id: value.id.into(),
1✔
278
            name: value.name,
1✔
279
            description: value.description,
1✔
280
            priority: value.priority,
1✔
281
            api_url: value.api_url,
1✔
282
            project_id: value.project_id,
1✔
283
            api_token: SECRET_REPLACEMENT.to_string(),
1✔
284
            filter_label: value.filter_label,
1✔
285
            cache_ttl: value.cache_ttl.into(),
1✔
286
        }
1✔
287
    }
1✔
288
}
289

290
#[type_tag(value = "CopernicusDataspace")]
50✔
291
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, ToSchema)]
70✔
292
#[serde(rename_all = "camelCase")]
293
pub struct CopernicusDataspaceDataProviderDefinition {
294
    pub name: String,
295
    pub description: String,
296
    pub id: DataProviderId,
297
    pub stac_url: String,
298
    pub s3_url: String,
299
    pub s3_access_key: String,
300
    pub s3_secret_key: String,
301
    pub gdal_config: Vec<GdalConfigOption>,
302
    pub priority: Option<i16>,
303
}
304

305
impl From<CopernicusDataspaceDataProviderDefinition>
306
    for crate::datasets::external::copernicus_dataspace::CopernicusDataspaceDataProviderDefinition
307
{
NEW
308
    fn from(value: CopernicusDataspaceDataProviderDefinition) -> Self {
×
NEW
309
        crate::datasets::external::copernicus_dataspace::CopernicusDataspaceDataProviderDefinition {
×
NEW
310
            name: value.name,
×
NEW
311
            description: value.description,
×
NEW
312
            id: value.id.into(),
×
NEW
313
            stac_url: value.stac_url,
×
NEW
314
            s3_url: value.s3_url,
×
NEW
315
            s3_access_key: value.s3_access_key,
×
NEW
316
            s3_secret_key: value.s3_secret_key,
×
NEW
317
            gdal_config: value.gdal_config,
×
NEW
318
            priority: value.priority,
×
NEW
319
        }
×
NEW
320
    }
×
321
}
322

323
impl
324
    From<crate::datasets::external::copernicus_dataspace::CopernicusDataspaceDataProviderDefinition>
325
    for CopernicusDataspaceDataProviderDefinition
326
{
NEW
327
    fn from(
×
NEW
328
        value: crate::datasets::external::copernicus_dataspace::CopernicusDataspaceDataProviderDefinition,
×
NEW
329
    ) -> Self {
×
NEW
330
        CopernicusDataspaceDataProviderDefinition {
×
NEW
331
            r#type: Default::default(),
×
NEW
332
            name: value.name,
×
NEW
333
            description: value.description,
×
NEW
334
            id: value.id.into(),
×
NEW
335
            stac_url: value.stac_url,
×
NEW
336
            s3_url: value.s3_url,
×
NEW
337
            s3_access_key: value.s3_access_key,
×
NEW
338
            s3_secret_key: SECRET_REPLACEMENT.to_string(),
×
NEW
339
            gdal_config: value.gdal_config,
×
NEW
340
            priority: value.priority,
×
NEW
341
        }
×
NEW
342
    }
×
343
}
344

345
#[type_tag(value = "EbvPortal")]
50✔
346
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, ToSchema)]
70✔
347
#[serde(rename_all = "camelCase")]
348
pub struct EbvPortalDataProviderDefinition {
349
    pub name: String,
350
    pub description: String,
351
    pub priority: Option<i16>,
352
    pub base_url: Url,
353
    /// Path were the `NetCDF` data can be found
354
    #[schema(value_type = String)]
355
    pub data: PathBuf,
356
    /// Path were overview files are stored
357
    #[schema(value_type = String)]
358
    pub overviews: PathBuf,
359
    #[serde(default)]
360
    pub cache_ttl: CacheTtlSeconds,
361
}
362

363
impl From<EbvPortalDataProviderDefinition>
364
    for crate::datasets::external::netcdfcf::EbvPortalDataProviderDefinition
365
{
NEW
366
    fn from(value: EbvPortalDataProviderDefinition) -> Self {
×
NEW
367
        crate::datasets::external::netcdfcf::EbvPortalDataProviderDefinition {
×
NEW
368
            name: value.name,
×
NEW
369
            description: value.description,
×
NEW
370
            priority: value.priority,
×
NEW
371
            base_url: value.base_url,
×
NEW
372
            data: value.data,
×
NEW
373
            overviews: value.overviews,
×
NEW
374
            cache_ttl: value.cache_ttl.into(),
×
NEW
375
        }
×
NEW
376
    }
×
377
}
378

379
impl From<crate::datasets::external::netcdfcf::EbvPortalDataProviderDefinition>
380
    for EbvPortalDataProviderDefinition
381
{
NEW
382
    fn from(value: crate::datasets::external::netcdfcf::EbvPortalDataProviderDefinition) -> Self {
×
NEW
383
        EbvPortalDataProviderDefinition {
×
NEW
384
            r#type: Default::default(),
×
NEW
385
            name: value.name,
×
NEW
386
            description: value.description,
×
NEW
387
            priority: value.priority,
×
NEW
388
            base_url: value.base_url,
×
NEW
389
            data: value.data,
×
NEW
390
            overviews: value.overviews,
×
NEW
391
            cache_ttl: value.cache_ttl.into(),
×
NEW
392
        }
×
NEW
393
    }
×
394
}
395

396
#[type_tag(value = "NetCdfCf")]
50✔
397
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, ToSchema)]
70✔
398
#[serde(rename_all = "camelCase")]
399
pub struct NetCdfCfDataProviderDefinition {
400
    pub name: String,
401
    pub description: String,
402
    pub priority: Option<i16>,
403
    /// Path were the `NetCDF` data can be found
404
    #[schema(value_type = String)]
405
    pub data: PathBuf,
406
    /// Path were overview files are stored
407
    #[schema(value_type = String)]
408
    pub overviews: PathBuf,
409
    #[serde(default)]
410
    pub cache_ttl: CacheTtlSeconds,
411
}
412

413
impl From<NetCdfCfDataProviderDefinition>
414
    for crate::datasets::external::netcdfcf::NetCdfCfDataProviderDefinition
415
{
NEW
416
    fn from(value: NetCdfCfDataProviderDefinition) -> Self {
×
NEW
417
        crate::datasets::external::netcdfcf::NetCdfCfDataProviderDefinition {
×
NEW
418
            name: value.name,
×
NEW
419
            description: value.description,
×
NEW
420
            priority: value.priority,
×
NEW
421
            data: value.data,
×
NEW
422
            overviews: value.overviews,
×
NEW
423
            cache_ttl: value.cache_ttl.into(),
×
NEW
424
        }
×
NEW
425
    }
×
426
}
427

428
impl From<crate::datasets::external::netcdfcf::NetCdfCfDataProviderDefinition>
429
    for NetCdfCfDataProviderDefinition
430
{
NEW
431
    fn from(value: crate::datasets::external::netcdfcf::NetCdfCfDataProviderDefinition) -> Self {
×
NEW
432
        NetCdfCfDataProviderDefinition {
×
NEW
433
            r#type: Default::default(),
×
NEW
434
            name: value.name,
×
NEW
435
            description: value.description,
×
NEW
436
            priority: value.priority,
×
NEW
437
            data: value.data,
×
NEW
438
            overviews: value.overviews,
×
NEW
439
            cache_ttl: value.cache_ttl.into(),
×
NEW
440
        }
×
NEW
441
    }
×
442
}
443

444
#[type_tag(value = "Pangaea")]
50✔
445
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, ToSchema)]
70✔
446
#[serde(rename_all = "camelCase")]
447
pub struct PangaeaDataProviderDefinition {
448
    pub name: String,
449
    pub description: String,
450
    pub priority: Option<i16>,
451
    pub base_url: Url,
452
    pub cache_ttl: CacheTtlSeconds,
453
}
454

455
impl From<PangaeaDataProviderDefinition>
456
    for crate::datasets::external::pangaea::PangaeaDataProviderDefinition
457
{
NEW
458
    fn from(value: PangaeaDataProviderDefinition) -> Self {
×
NEW
459
        crate::datasets::external::pangaea::PangaeaDataProviderDefinition {
×
NEW
460
            name: value.name,
×
NEW
461
            description: value.description,
×
NEW
462
            priority: value.priority,
×
NEW
463
            base_url: value.base_url,
×
NEW
464
            cache_ttl: value.cache_ttl.into(),
×
NEW
465
        }
×
NEW
466
    }
×
467
}
468

469
impl From<crate::datasets::external::pangaea::PangaeaDataProviderDefinition>
470
    for PangaeaDataProviderDefinition
471
{
NEW
472
    fn from(value: crate::datasets::external::pangaea::PangaeaDataProviderDefinition) -> Self {
×
NEW
473
        PangaeaDataProviderDefinition {
×
NEW
474
            r#type: Default::default(),
×
NEW
475
            name: value.name,
×
NEW
476
            description: value.description,
×
NEW
477
            priority: value.priority,
×
NEW
478
            base_url: value.base_url,
×
NEW
479
            cache_ttl: value.cache_ttl.into(),
×
NEW
480
        }
×
NEW
481
    }
×
482
}
483

484
#[type_tag(value = "Edr")]
50✔
485
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, ToSchema)]
70✔
486
#[serde(rename_all = "camelCase")]
487
pub struct EdrDataProviderDefinition {
488
    pub name: String,
489
    pub description: String,
490
    pub priority: Option<i16>,
491
    pub id: DataProviderId,
492
    #[serde(deserialize_with = "deserialize_base_url")]
493
    pub base_url: Url,
494
    pub vector_spec: Option<EdrVectorSpec>,
495
    #[serde(default)]
496
    pub cache_ttl: CacheTtlSeconds,
497
    #[serde(default)]
498
    /// List of vertical reference systems with a discrete scale
499
    pub discrete_vrs: Vec<String>,
500
    pub provenance: Option<Vec<Provenance>>,
501
}
502

503
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, ToSchema)]
85✔
504
pub struct EdrVectorSpec {
505
    pub x: String,
506
    pub y: Option<String>,
507
    pub time: String,
508
}
509

510
impl From<EdrVectorSpec> for crate::datasets::external::edr::EdrVectorSpec {
NEW
511
    fn from(value: EdrVectorSpec) -> Self {
×
NEW
512
        crate::datasets::external::edr::EdrVectorSpec {
×
NEW
513
            x: value.x,
×
NEW
514
            y: value.y,
×
NEW
515
            time: value.time,
×
NEW
516
        }
×
NEW
517
    }
×
518
}
519

520
impl From<crate::datasets::external::edr::EdrVectorSpec> for EdrVectorSpec {
NEW
521
    fn from(value: crate::datasets::external::edr::EdrVectorSpec) -> Self {
×
NEW
522
        EdrVectorSpec {
×
NEW
523
            x: value.x,
×
NEW
524
            y: value.y,
×
NEW
525
            time: value.time,
×
NEW
526
        }
×
NEW
527
    }
×
528
}
529

530
impl From<EdrDataProviderDefinition> for crate::datasets::external::edr::EdrDataProviderDefinition {
NEW
531
    fn from(value: EdrDataProviderDefinition) -> Self {
×
NEW
532
        crate::datasets::external::edr::EdrDataProviderDefinition {
×
NEW
533
            name: value.name,
×
NEW
534
            description: value.description,
×
NEW
535
            priority: value.priority,
×
NEW
536
            id: value.id.into(),
×
NEW
537
            base_url: value.base_url,
×
NEW
538
            vector_spec: value.vector_spec.map(Into::into),
×
NEW
539
            cache_ttl: value.cache_ttl.into(),
×
NEW
540
            discrete_vrs: value.discrete_vrs,
×
NEW
541
            provenance: value
×
NEW
542
                .provenance
×
NEW
543
                .map(|v| v.into_iter().map(Into::into).collect()),
×
NEW
544
        }
×
NEW
545
    }
×
546
}
547

548
impl From<crate::datasets::external::edr::EdrDataProviderDefinition> for EdrDataProviderDefinition {
NEW
549
    fn from(value: crate::datasets::external::edr::EdrDataProviderDefinition) -> Self {
×
NEW
550
        EdrDataProviderDefinition {
×
NEW
551
            r#type: Default::default(),
×
NEW
552
            name: value.name,
×
NEW
553
            description: value.description,
×
NEW
554
            priority: value.priority,
×
NEW
555
            id: value.id.into(),
×
NEW
556
            base_url: value.base_url,
×
NEW
557
            vector_spec: value.vector_spec.map(Into::into),
×
NEW
558
            cache_ttl: value.cache_ttl.into(),
×
NEW
559
            discrete_vrs: value.discrete_vrs,
×
NEW
560
            provenance: value
×
NEW
561
                .provenance
×
NEW
562
                .map(|v| v.into_iter().map(Into::into).collect()),
×
NEW
563
        }
×
NEW
564
    }
×
565
}
566

567
#[type_tag(value = "Gbif")]
50✔
568
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, ToSchema)]
70✔
569
#[serde(rename_all = "camelCase")]
570
pub struct GbifDataProviderDefinition {
571
    pub name: String,
572
    pub description: String,
573
    pub priority: Option<i16>,
574
    pub db_config: DatabaseConnectionConfig,
575
    #[serde(default)]
576
    pub cache_ttl: CacheTtlSeconds,
577
    pub autocomplete_timeout: i32,
578
    pub columns: Vec<String>,
579
}
580

581
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, ToSchema)]
315✔
582
pub struct DatabaseConnectionConfig {
583
    pub host: String,
584
    pub port: u16,
585
    pub database: String,
586
    pub schema: String,
587
    pub user: String,
588
    pub password: String,
589
}
590

591
impl From<DatabaseConnectionConfig> for crate::util::postgres::DatabaseConnectionConfig {
NEW
592
    fn from(value: DatabaseConnectionConfig) -> Self {
×
NEW
593
        crate::util::postgres::DatabaseConnectionConfig {
×
NEW
594
            host: value.host,
×
NEW
595
            port: value.port,
×
NEW
596
            database: value.database,
×
NEW
597
            schema: value.schema,
×
NEW
598
            user: value.user,
×
NEW
599
            password: value.password,
×
NEW
600
        }
×
NEW
601
    }
×
602
}
603

604
impl From<crate::util::postgres::DatabaseConnectionConfig> for DatabaseConnectionConfig {
NEW
605
    fn from(value: crate::util::postgres::DatabaseConnectionConfig) -> Self {
×
NEW
606
        DatabaseConnectionConfig {
×
NEW
607
            host: value.host,
×
NEW
608
            port: value.port,
×
NEW
609
            database: value.database,
×
NEW
610
            schema: value.schema,
×
NEW
611
            user: value.user,
×
NEW
612
            password: SECRET_REPLACEMENT.to_string(),
×
NEW
613
        }
×
NEW
614
    }
×
615
}
616

617
impl From<GbifDataProviderDefinition>
618
    for crate::datasets::external::gbif::GbifDataProviderDefinition
619
{
NEW
620
    fn from(value: GbifDataProviderDefinition) -> Self {
×
NEW
621
        crate::datasets::external::gbif::GbifDataProviderDefinition {
×
NEW
622
            name: value.name,
×
NEW
623
            description: value.description,
×
NEW
624
            priority: value.priority,
×
NEW
625
            db_config: value.db_config.into(),
×
NEW
626
            cache_ttl: value.cache_ttl.into(),
×
NEW
627
            autocomplete_timeout: value.autocomplete_timeout,
×
NEW
628
            columns: value.columns,
×
NEW
629
        }
×
NEW
630
    }
×
631
}
632

633
impl From<crate::datasets::external::gbif::GbifDataProviderDefinition>
634
    for GbifDataProviderDefinition
635
{
NEW
636
    fn from(value: crate::datasets::external::gbif::GbifDataProviderDefinition) -> Self {
×
NEW
637
        GbifDataProviderDefinition {
×
NEW
638
            r#type: Default::default(),
×
NEW
639
            name: value.name,
×
NEW
640
            description: value.description,
×
NEW
641
            priority: value.priority,
×
NEW
642
            db_config: value.db_config.into(),
×
NEW
643
            cache_ttl: value.cache_ttl.into(),
×
NEW
644
            autocomplete_timeout: value.autocomplete_timeout,
×
NEW
645
            columns: value.columns,
×
NEW
646
        }
×
NEW
647
    }
×
648
}
649

650
#[type_tag(value = "GfbioAbcd")]
50✔
651
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, ToSchema)]
70✔
652
#[serde(rename_all = "camelCase")]
653
pub struct GfbioAbcdDataProviderDefinition {
654
    pub name: String,
655
    pub description: String,
656
    pub priority: Option<i16>,
657
    pub db_config: DatabaseConnectionConfig,
658
    #[serde(default)]
659
    pub cache_ttl: CacheTtlSeconds,
660
}
661

662
impl From<GfbioAbcdDataProviderDefinition>
663
    for crate::datasets::external::gfbio_abcd::GfbioAbcdDataProviderDefinition
664
{
NEW
665
    fn from(value: GfbioAbcdDataProviderDefinition) -> Self {
×
NEW
666
        crate::datasets::external::gfbio_abcd::GfbioAbcdDataProviderDefinition {
×
NEW
667
            name: value.name,
×
NEW
668
            description: value.description,
×
NEW
669
            priority: value.priority,
×
NEW
670
            db_config: value.db_config.into(),
×
NEW
671
            cache_ttl: value.cache_ttl.into(),
×
NEW
672
        }
×
NEW
673
    }
×
674
}
675

676
impl From<crate::datasets::external::gfbio_abcd::GfbioAbcdDataProviderDefinition>
677
    for GfbioAbcdDataProviderDefinition
678
{
NEW
679
    fn from(value: crate::datasets::external::gfbio_abcd::GfbioAbcdDataProviderDefinition) -> Self {
×
NEW
680
        GfbioAbcdDataProviderDefinition {
×
NEW
681
            r#type: Default::default(),
×
NEW
682
            name: value.name,
×
NEW
683
            description: value.description,
×
NEW
684
            priority: value.priority,
×
NEW
685
            db_config: value.db_config.into(),
×
NEW
686
            cache_ttl: value.cache_ttl.into(),
×
NEW
687
        }
×
NEW
688
    }
×
689
}
690

691
#[type_tag(value = "GfbioCollections")]
50✔
692
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, ToSchema)]
70✔
693
#[serde(rename_all = "camelCase")]
694
pub struct GfbioCollectionsDataProviderDefinition {
695
    pub name: String,
696
    pub description: String,
697
    pub priority: Option<i16>,
698
    pub collection_api_url: Url,
699
    pub collection_api_auth_token: String,
700
    pub abcd_db_config: DatabaseConnectionConfig,
701
    pub pangaea_url: Url,
702
    #[serde(default)]
703
    pub cache_ttl: CacheTtlSeconds,
704
}
705

706
impl From<GfbioCollectionsDataProviderDefinition>
707
    for crate::datasets::external::gfbio_collections::GfbioCollectionsDataProviderDefinition
708
{
NEW
709
    fn from(value: GfbioCollectionsDataProviderDefinition) -> Self {
×
NEW
710
        crate::datasets::external::gfbio_collections::GfbioCollectionsDataProviderDefinition {
×
NEW
711
            name: value.name,
×
NEW
712
            description: value.description,
×
NEW
713
            priority: value.priority,
×
NEW
714
            collection_api_url: value.collection_api_url,
×
NEW
715
            collection_api_auth_token: value.collection_api_auth_token,
×
NEW
716
            abcd_db_config: value.abcd_db_config.into(),
×
NEW
717
            pangaea_url: value.pangaea_url,
×
NEW
718
            cache_ttl: value.cache_ttl.into(),
×
NEW
719
        }
×
NEW
720
    }
×
721
}
722

723
impl From<crate::datasets::external::gfbio_collections::GfbioCollectionsDataProviderDefinition>
724
    for GfbioCollectionsDataProviderDefinition
725
{
NEW
726
    fn from(
×
NEW
727
        value: crate::datasets::external::gfbio_collections::GfbioCollectionsDataProviderDefinition,
×
NEW
728
    ) -> Self {
×
NEW
729
        GfbioCollectionsDataProviderDefinition {
×
NEW
730
            r#type: Default::default(),
×
NEW
731
            name: value.name,
×
NEW
732
            description: value.description,
×
NEW
733
            priority: value.priority,
×
NEW
734
            collection_api_url: value.collection_api_url,
×
NEW
735
            collection_api_auth_token: value.collection_api_auth_token,
×
NEW
736
            abcd_db_config: value.abcd_db_config.into(),
×
NEW
737
            pangaea_url: value.pangaea_url,
×
NEW
738
            cache_ttl: value.cache_ttl.into(),
×
NEW
739
        }
×
NEW
740
    }
×
741
}
742

743
#[type_tag(value = "SentinelS2L2ACogs")]
50✔
744
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, ToSchema)]
70✔
745
#[serde(rename_all = "camelCase")]
746
pub struct SentinelS2L2ACogsProviderDefinition {
747
    pub name: String,
748
    pub id: DataProviderId,
749
    pub description: String,
750
    pub priority: Option<i16>,
751
    pub api_url: String,
752
    pub bands: Vec<StacBand>,
753
    pub zones: Vec<StacZone>,
754
    #[serde(default)]
755
    pub stac_api_retries: StacApiRetries,
756
    #[serde(default)]
757
    pub gdal_retries: usize,
758
    #[serde(default)]
759
    pub cache_ttl: CacheTtlSeconds,
760
    #[serde(default)]
761
    pub query_buffer: StacQueryBuffer,
762
}
763

764
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ToSchema)]
85✔
765
#[serde(rename_all = "camelCase")]
766
pub struct StacBand {
767
    pub name: String,
768
    pub no_data_value: Option<f64>,
769
    pub data_type: RasterDataType,
770
}
771

772
impl From<StacBand> for crate::datasets::external::sentinel_s2_l2a_cogs::StacBand {
NEW
773
    fn from(value: StacBand) -> Self {
×
NEW
774
        crate::datasets::external::sentinel_s2_l2a_cogs::StacBand {
×
NEW
775
            name: value.name,
×
NEW
776
            no_data_value: value.no_data_value,
×
NEW
777
            data_type: value.data_type.into(),
×
NEW
778
        }
×
NEW
779
    }
×
780
}
781

782
impl From<crate::datasets::external::sentinel_s2_l2a_cogs::StacBand> for StacBand {
NEW
783
    fn from(value: crate::datasets::external::sentinel_s2_l2a_cogs::StacBand) -> Self {
×
NEW
784
        StacBand {
×
NEW
785
            name: value.name,
×
NEW
786
            no_data_value: value.no_data_value,
×
NEW
787
            data_type: value.data_type.into(),
×
NEW
788
        }
×
NEW
789
    }
×
790
}
791

792
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, ToSchema)]
115✔
793
pub struct StacZone {
794
    pub name: String,
795
    pub epsg: u32,
796
}
797

798
impl From<StacZone> for crate::datasets::external::sentinel_s2_l2a_cogs::StacZone {
NEW
799
    fn from(value: StacZone) -> Self {
×
NEW
800
        crate::datasets::external::sentinel_s2_l2a_cogs::StacZone {
×
NEW
801
            name: value.name,
×
NEW
802
            epsg: value.epsg,
×
NEW
803
        }
×
NEW
804
    }
×
805
}
806

807
impl From<crate::datasets::external::sentinel_s2_l2a_cogs::StacZone> for StacZone {
NEW
808
    fn from(value: crate::datasets::external::sentinel_s2_l2a_cogs::StacZone) -> Self {
×
NEW
809
        StacZone {
×
NEW
810
            name: value.name,
×
NEW
811
            epsg: value.epsg,
×
NEW
812
        }
×
NEW
813
    }
×
814
}
815

816
#[derive(Clone, Copy, Debug, Serialize, Deserialize, PartialEq, ToSchema, Default)]
115✔
817
#[serde(rename_all = "camelCase")]
818
pub struct StacApiRetries {
819
    pub number_of_retries: usize,
820
    pub initial_delay_ms: u64,
821
    pub exponential_backoff_factor: f64,
822
}
823

824
impl From<StacApiRetries> for crate::datasets::external::sentinel_s2_l2a_cogs::StacApiRetries {
NEW
825
    fn from(value: StacApiRetries) -> Self {
×
NEW
826
        crate::datasets::external::sentinel_s2_l2a_cogs::StacApiRetries {
×
NEW
827
            number_of_retries: value.number_of_retries,
×
NEW
828
            initial_delay_ms: value.initial_delay_ms,
×
NEW
829
            exponential_backoff_factor: value.exponential_backoff_factor,
×
NEW
830
        }
×
NEW
831
    }
×
832
}
833

834
impl From<crate::datasets::external::sentinel_s2_l2a_cogs::StacApiRetries> for StacApiRetries {
NEW
835
    fn from(value: crate::datasets::external::sentinel_s2_l2a_cogs::StacApiRetries) -> Self {
×
NEW
836
        StacApiRetries {
×
NEW
837
            number_of_retries: value.number_of_retries,
×
NEW
838
            initial_delay_ms: value.initial_delay_ms,
×
NEW
839
            exponential_backoff_factor: value.exponential_backoff_factor,
×
NEW
840
        }
×
NEW
841
    }
×
842
}
843

844
#[derive(Clone, Copy, Debug, Serialize, Deserialize, PartialEq, ToSchema, Default)]
115✔
845
#[serde(rename_all = "camelCase")]
846
/// A struct that represents buffers to apply to stac requests
847
pub struct StacQueryBuffer {
848
    pub start_seconds: i64,
849
    pub end_seconds: i64,
850
    // TODO: add also spatial buffers?
851
}
852

853
impl From<StacQueryBuffer> for crate::datasets::external::sentinel_s2_l2a_cogs::StacQueryBuffer {
NEW
854
    fn from(value: StacQueryBuffer) -> Self {
×
NEW
855
        crate::datasets::external::sentinel_s2_l2a_cogs::StacQueryBuffer {
×
NEW
856
            start_seconds: value.start_seconds,
×
NEW
857
            end_seconds: value.end_seconds,
×
NEW
858
        }
×
NEW
859
    }
×
860
}
861

862
impl From<crate::datasets::external::sentinel_s2_l2a_cogs::StacQueryBuffer> for StacQueryBuffer {
NEW
863
    fn from(value: crate::datasets::external::sentinel_s2_l2a_cogs::StacQueryBuffer) -> Self {
×
NEW
864
        StacQueryBuffer {
×
NEW
865
            start_seconds: value.start_seconds,
×
NEW
866
            end_seconds: value.end_seconds,
×
NEW
867
        }
×
NEW
868
    }
×
869
}
870

871
impl From<usize> for GdalRetries {
NEW
872
    fn from(value: usize) -> Self {
×
NEW
873
        GdalRetries {
×
NEW
874
            number_of_retries: value,
×
NEW
875
        }
×
NEW
876
    }
×
877
}
878

879
impl From<GdalRetries> for usize {
NEW
880
    fn from(value: GdalRetries) -> Self {
×
NEW
881
        value.number_of_retries
×
NEW
882
    }
×
883
}
884

885
impl From<SentinelS2L2ACogsProviderDefinition>
886
    for crate::datasets::external::sentinel_s2_l2a_cogs::SentinelS2L2ACogsProviderDefinition
887
{
NEW
888
    fn from(value: SentinelS2L2ACogsProviderDefinition) -> Self {
×
NEW
889
        crate::datasets::external::sentinel_s2_l2a_cogs::SentinelS2L2ACogsProviderDefinition {
×
NEW
890
            name: value.name,
×
NEW
891
            id: value.id.into(),
×
NEW
892
            description: value.description,
×
NEW
893
            priority: value.priority,
×
NEW
894
            api_url: value.api_url,
×
NEW
895
            bands: value.bands.into_iter().map(Into::into).collect(),
×
NEW
896
            zones: value.zones.into_iter().map(Into::into).collect(),
×
NEW
897
            stac_api_retries: value.stac_api_retries.into(),
×
NEW
898
            gdal_retries: value.gdal_retries.into(),
×
NEW
899
            cache_ttl: value.cache_ttl.into(),
×
NEW
900
            query_buffer: value.query_buffer.into(),
×
NEW
901
        }
×
NEW
902
    }
×
903
}
904

905
impl From<crate::datasets::external::sentinel_s2_l2a_cogs::SentinelS2L2ACogsProviderDefinition>
906
    for SentinelS2L2ACogsProviderDefinition
907
{
NEW
908
    fn from(
×
NEW
909
        value: crate::datasets::external::sentinel_s2_l2a_cogs::SentinelS2L2ACogsProviderDefinition,
×
NEW
910
    ) -> Self {
×
NEW
911
        SentinelS2L2ACogsProviderDefinition {
×
NEW
912
            r#type: Default::default(),
×
NEW
913
            name: value.name,
×
NEW
914
            id: value.id.into(),
×
NEW
915
            description: value.description,
×
NEW
916
            priority: value.priority,
×
NEW
917
            api_url: value.api_url,
×
NEW
918
            bands: value.bands.into_iter().map(Into::into).collect(),
×
NEW
919
            zones: value.zones.into_iter().map(Into::into).collect(),
×
NEW
920
            stac_api_retries: value.stac_api_retries.into(),
×
NEW
921
            gdal_retries: value.gdal_retries.into(),
×
NEW
922
            cache_ttl: value.cache_ttl.into(),
×
NEW
923
            query_buffer: value.query_buffer.into(),
×
NEW
924
        }
×
NEW
925
    }
×
926
}
927

928
#[type_tag(value = "DatasetLayerListing")]
50✔
929
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, ToSchema)]
70✔
930
#[serde(rename_all = "camelCase")]
931
pub struct DatasetLayerListingProviderDefinition {
932
    pub id: DataProviderId,
933
    pub name: String,
934
    pub description: String,
935
    pub priority: Option<i16>,
936
    pub collections: Vec<DatasetLayerListingCollection>,
937
}
938

939
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, ToSchema)]
115✔
940
pub struct DatasetLayerListingCollection {
941
    pub name: String,
942
    pub description: String,
943
    pub tags: Vec<String>,
944
}
945

946
impl From<DatasetLayerListingCollection>
947
    for crate::datasets::dataset_listing_provider::DatasetLayerListingCollection
948
{
949
    fn from(value: DatasetLayerListingCollection) -> Self {
11✔
950
        crate::datasets::dataset_listing_provider::DatasetLayerListingCollection {
11✔
951
            name: value.name,
11✔
952
            description: value.description,
11✔
953
            tags: value.tags,
11✔
954
        }
11✔
955
    }
11✔
956
}
957

958
impl From<crate::datasets::dataset_listing_provider::DatasetLayerListingCollection>
959
    for DatasetLayerListingCollection
960
{
961
    fn from(
17✔
962
        value: crate::datasets::dataset_listing_provider::DatasetLayerListingCollection,
17✔
963
    ) -> Self {
17✔
964
        DatasetLayerListingCollection {
17✔
965
            name: value.name,
17✔
966
            description: value.description,
17✔
967
            tags: value.tags,
17✔
968
        }
17✔
969
    }
17✔
970
}
971

972
impl From<DatasetLayerListingProviderDefinition>
973
    for crate::datasets::dataset_listing_provider::DatasetLayerListingProviderDefinition
974
{
975
    fn from(value: DatasetLayerListingProviderDefinition) -> Self {
5✔
976
        crate::datasets::dataset_listing_provider::DatasetLayerListingProviderDefinition {
5✔
977
            id: value.id.into(),
5✔
978
            name: value.name,
5✔
979
            description: value.description,
5✔
980
            priority: value.priority,
5✔
981
            collections: value.collections.into_iter().map(Into::into).collect(),
5✔
982
        }
5✔
983
    }
5✔
984
}
985

986
impl From<crate::datasets::dataset_listing_provider::DatasetLayerListingProviderDefinition>
987
    for DatasetLayerListingProviderDefinition
988
{
989
    fn from(
7✔
990
        value: crate::datasets::dataset_listing_provider::DatasetLayerListingProviderDefinition,
7✔
991
    ) -> Self {
7✔
992
        DatasetLayerListingProviderDefinition {
7✔
993
            r#type: Default::default(),
7✔
994
            id: value.id.into(),
7✔
995
            name: value.name,
7✔
996
            description: value.description,
7✔
997
            priority: value.priority,
7✔
998
            collections: value.collections.into_iter().map(Into::into).collect(),
7✔
999
        }
7✔
1000
    }
7✔
1001
}
1002

1003
#[type_tag(value = "WildLIVE!")]
40✔
1004
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, ToSchema)]
60✔
1005
#[serde(rename_all = "camelCase")]
1006
pub struct WildliveDataConnectorDefinition {
1007
    pub id: DataProviderId,
1008
    pub name: String,
1009
    pub description: String,
1010
    pub api_key: Option<String>,
1011
    pub priority: Option<i16>,
1012
}
1013

1014
impl From<WildliveDataConnectorDefinition>
1015
    for crate::datasets::external::WildliveDataConnectorDefinition
1016
{
NEW
1017
    fn from(value: WildliveDataConnectorDefinition) -> Self {
×
NEW
1018
        crate::datasets::external::WildliveDataConnectorDefinition {
×
NEW
1019
            id: value.id.into(),
×
NEW
1020
            name: value.name,
×
NEW
1021
            description: value.description,
×
NEW
1022
            api_key: value.api_key,
×
NEW
1023
            priority: value.priority,
×
NEW
1024
        }
×
NEW
1025
    }
×
1026
}
1027

1028
impl From<crate::datasets::external::WildliveDataConnectorDefinition>
1029
    for WildliveDataConnectorDefinition
1030
{
NEW
1031
    fn from(value: crate::datasets::external::WildliveDataConnectorDefinition) -> Self {
×
NEW
1032
        WildliveDataConnectorDefinition {
×
NEW
1033
            r#type: Default::default(),
×
NEW
1034
            id: value.id.into(),
×
NEW
1035
            name: value.name,
×
NEW
1036
            description: value.description,
×
NEW
1037
            api_key: Some(SECRET_REPLACEMENT.to_string()),
×
NEW
1038
            priority: value.priority,
×
NEW
1039
        }
×
NEW
1040
    }
×
1041
}
1042

1043
#[derive(PartialEq, Debug, Serialize, Deserialize, Clone, ToSchema)]
75✔
1044
#[allow(clippy::enum_variant_names)] // TODO: think about better names
1045
#[schema(discriminator = "type")]
1046
#[serde(untagged)]
1047
pub enum TypedDataProviderDefinition {
1048
    ArunaDataProviderDefinition(ArunaDataProviderDefinition),
1049
    CopernicusDataspaceDataProviderDefinition(CopernicusDataspaceDataProviderDefinition),
1050
    DatasetLayerListingProviderDefinition(DatasetLayerListingProviderDefinition),
1051
    EbvPortalDataProviderDefinition(EbvPortalDataProviderDefinition),
1052
    EdrDataProviderDefinition(EdrDataProviderDefinition),
1053
    GbifDataProviderDefinition(GbifDataProviderDefinition),
1054
    GfbioAbcdDataProviderDefinition(GfbioAbcdDataProviderDefinition),
1055
    GfbioCollectionsDataProviderDefinition(GfbioCollectionsDataProviderDefinition),
1056
    NetCdfCfDataProviderDefinition(NetCdfCfDataProviderDefinition),
1057
    PangaeaDataProviderDefinition(PangaeaDataProviderDefinition),
1058
    SentinelS2L2ACogsProviderDefinition(SentinelS2L2ACogsProviderDefinition),
1059
    WildliveDataConnectorDefinition(WildliveDataConnectorDefinition),
1060
}
1061

1062
impl From<TypedDataProviderDefinition> for crate::layers::external::TypedDataProviderDefinition {
1063
    fn from(value: TypedDataProviderDefinition) -> Self {
6✔
1064
        match value {
6✔
1065
            TypedDataProviderDefinition::ArunaDataProviderDefinition(def) => crate::layers::external::TypedDataProviderDefinition::ArunaDataProviderDefinition(def.into()),
1✔
NEW
1066
            TypedDataProviderDefinition::CopernicusDataspaceDataProviderDefinition(def) => crate::layers::external::TypedDataProviderDefinition::CopernicusDataspaceDataProviderDefinition(def.into()),
×
1067
            TypedDataProviderDefinition::DatasetLayerListingProviderDefinition(def) => crate::layers::external::TypedDataProviderDefinition::DatasetLayerListingProviderDefinition(def.into()),
5✔
NEW
1068
            TypedDataProviderDefinition::EbvPortalDataProviderDefinition(def) => crate::layers::external::TypedDataProviderDefinition::EbvPortalDataProviderDefinition(def.into()),
×
NEW
1069
            TypedDataProviderDefinition::EdrDataProviderDefinition(def) => crate::layers::external::TypedDataProviderDefinition::EdrDataProviderDefinition(def.into()),
×
NEW
1070
            TypedDataProviderDefinition::GbifDataProviderDefinition(def) => crate::layers::external::TypedDataProviderDefinition::GbifDataProviderDefinition(def.into()),
×
NEW
1071
            TypedDataProviderDefinition::GfbioAbcdDataProviderDefinition(def) => crate::layers::external::TypedDataProviderDefinition::GfbioAbcdDataProviderDefinition(def.into()),
×
NEW
1072
            TypedDataProviderDefinition::GfbioCollectionsDataProviderDefinition(def) => crate::layers::external::TypedDataProviderDefinition::GfbioCollectionsDataProviderDefinition(def.into()),
×
NEW
1073
            TypedDataProviderDefinition::NetCdfCfDataProviderDefinition(def) => crate::layers::external::TypedDataProviderDefinition::NetCdfCfDataProviderDefinition(def.into()),
×
NEW
1074
            TypedDataProviderDefinition::PangaeaDataProviderDefinition(def) => crate::layers::external::TypedDataProviderDefinition::PangaeaDataProviderDefinition(def.into()),
×
NEW
1075
            TypedDataProviderDefinition::SentinelS2L2ACogsProviderDefinition(def) => crate::layers::external::TypedDataProviderDefinition::SentinelS2L2ACogsProviderDefinition(def.into()),
×
NEW
1076
            TypedDataProviderDefinition::WildliveDataConnectorDefinition(def) => crate::layers::external::TypedDataProviderDefinition::WildliveDataConnectorDefinition(def.into()),
×
1077
        }
1078
    }
6✔
1079
}
1080

1081
impl From<crate::layers::external::TypedDataProviderDefinition> for TypedDataProviderDefinition {
1082
    fn from(value: crate::layers::external::TypedDataProviderDefinition) -> Self {
1✔
1083
        match value {
1✔
NEW
1084
            crate::layers::external::TypedDataProviderDefinition::ArunaDataProviderDefinition(def) => TypedDataProviderDefinition::ArunaDataProviderDefinition(def.into()),
×
NEW
1085
            crate::layers::external::TypedDataProviderDefinition::CopernicusDataspaceDataProviderDefinition(def) => TypedDataProviderDefinition::CopernicusDataspaceDataProviderDefinition(def.into()),
×
1086
            crate::layers::external::TypedDataProviderDefinition::DatasetLayerListingProviderDefinition(def) => TypedDataProviderDefinition::DatasetLayerListingProviderDefinition(def.into()),
1✔
NEW
1087
            crate::layers::external::TypedDataProviderDefinition::EbvPortalDataProviderDefinition(def) => TypedDataProviderDefinition::EbvPortalDataProviderDefinition(def.into()),
×
NEW
1088
            crate::layers::external::TypedDataProviderDefinition::EdrDataProviderDefinition(def) => TypedDataProviderDefinition::EdrDataProviderDefinition(def.into()),
×
NEW
1089
            crate::layers::external::TypedDataProviderDefinition::GbifDataProviderDefinition(def) => TypedDataProviderDefinition::GbifDataProviderDefinition(def.into()),
×
NEW
1090
            crate::layers::external::TypedDataProviderDefinition::GfbioAbcdDataProviderDefinition(def) => TypedDataProviderDefinition::GfbioAbcdDataProviderDefinition(def.into()),
×
NEW
1091
            crate::layers::external::TypedDataProviderDefinition::GfbioCollectionsDataProviderDefinition(def) => TypedDataProviderDefinition::GfbioCollectionsDataProviderDefinition(def.into()),
×
NEW
1092
            crate::layers::external::TypedDataProviderDefinition::NetCdfCfDataProviderDefinition(def) => TypedDataProviderDefinition::NetCdfCfDataProviderDefinition(def.into()),
×
NEW
1093
            crate::layers::external::TypedDataProviderDefinition::PangaeaDataProviderDefinition(def) => TypedDataProviderDefinition::PangaeaDataProviderDefinition(def.into()),
×
NEW
1094
            crate::layers::external::TypedDataProviderDefinition::SentinelS2L2ACogsProviderDefinition(def) => TypedDataProviderDefinition::SentinelS2L2ACogsProviderDefinition(def.into()),
×
NEW
1095
            crate::layers::external::TypedDataProviderDefinition::WildliveDataConnectorDefinition(def) => TypedDataProviderDefinition::WildliveDataConnectorDefinition(def.into()),
×
1096
        }
1097
    }
1✔
1098
}
1099

1100
impl From<&Volume> for crate::datasets::upload::Volume {
1101
    fn from(value: &Volume) -> Self {
4✔
1102
        Self {
4✔
1103
            name: VolumeName(value.name.clone()),
4✔
1104
            path: value.path.as_ref().map_or_else(PathBuf::new, PathBuf::from),
4✔
1105
        }
4✔
1106
    }
4✔
1107
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc