Skip to content

Commit 16230bd

Browse files
bors[bot]ttencate
andauthored
Merge #251
251: Add functions to enumerate Drivers r=jdroenner,lnicola a=ttencate - [x] I agree to follow the project's [code of conduct](https://github.com/georust/gdal/blob/master/CODE_OF_CONDUCT.md). - [x] I added an entry to `CHANGES.md` if knowledge of this change could be valuable to users. --- Co-authored-by: Thomas ten Cate <[email protected]>
2 parents 0173cf0 + 947e7e9 commit 16230bd

File tree

9 files changed

+52
-29
lines changed

9 files changed

+52
-29
lines changed

CHANGES.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,10 @@
1010

1111
- https://github.com/georust/gdal/pull/267
1212

13+
- **Breaking**: Rename `Driver::get` to `Driver::get_by_name`, add `Driver::get(usize)` and `Driver::count`
14+
15+
- <https://github.com/georust/gdal/pull/251>
16+
1317
- Add `programs::raster::build_vrt`
1418
- Add `GeoTransformEx` extension trait with `apply` and `invert`
1519

@@ -92,7 +96,7 @@
9296
- <https://github.com/georust/gdal/pull/193>
9397

9498
```rust
95-
let driver = Driver::get("GTiff").unwrap();
99+
let driver = Driver::get_by_name("GTiff").unwrap();
96100
let options = &[
97101
RasterCreationOption {
98102
key: "COMPRESS",

examples/metadata.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ fn main() {
22
use gdal::{Dataset, Metadata};
33
use std::path::Path;
44

5-
let driver = gdal::Driver::get("mem").unwrap();
5+
let driver = gdal::Driver::get_by_name("mem").unwrap();
66
println!("driver description: {:?}", driver.description());
77

88
let path = Path::new("./fixtures/tinymarble.png");

examples/read_write_ogr.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ fn run() -> Result<()> {
1717
// Create a new dataset:
1818
let path = std::env::temp_dir().join("abcde.shp");
1919
let _ = fs::remove_file(&path);
20-
let drv = Driver::get("ESRI Shapefile")?;
20+
let drv = Driver::get_by_name("ESRI Shapefile")?;
2121
let mut ds = drv.create_vector_only(path.to_str().unwrap())?;
2222
let lyr = ds.create_layer(Default::default())?;
2323

examples/read_write_ogr_datetime.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ fn run() -> gdal::errors::Result<()> {
1515
// Create a new dataset:
1616
let path = std::env::temp_dir().join("later.geojson");
1717
let _ = std::fs::remove_file(&path);
18-
let drv = Driver::get("GeoJSON")?;
18+
let drv = Driver::get_by_name("GeoJSON")?;
1919
let mut ds = drv.create_vector_only(path.to_str().unwrap())?;
2020
let lyr = ds.create_layer(Default::default())?;
2121

examples/write_ogr.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use std::fs;
77
fn example_1() -> Result<()> {
88
let path = std::env::temp_dir().join("output1.geojson");
99
let _ = fs::remove_file(&path);
10-
let drv = Driver::get("GeoJSON")?;
10+
let drv = Driver::get_by_name("GeoJSON")?;
1111
let mut ds = drv.create_vector_only(path.to_str().unwrap())?;
1212

1313
let lyr = ds.create_layer(Default::default())?;
@@ -52,7 +52,7 @@ fn example_1() -> Result<()> {
5252
fn example_2() -> Result<()> {
5353
let path = std::env::temp_dir().join("output2.geojson");
5454
let _ = fs::remove_file(&path);
55-
let driver = Driver::get("GeoJSON")?;
55+
let driver = Driver::get_by_name("GeoJSON")?;
5656
let mut ds = driver.create_vector_only(path.to_str().unwrap())?;
5757
let mut layer = ds.create_layer(Default::default())?;
5858

src/dataset.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -552,7 +552,7 @@ impl Dataset {
552552
///
553553
/// ```
554554
/// # use gdal::Driver;
555-
/// # let driver = Driver::get("GPKG").unwrap();
555+
/// # let driver = Driver::get_by_name("GPKG").unwrap();
556556
/// # let mut dataset = driver.create_vector_only("/vsimem/example.gpkg").unwrap();
557557
/// let blank_layer = dataset.create_layer(Default::default()).unwrap();
558558
/// ```
@@ -562,7 +562,7 @@ impl Dataset {
562562
/// ```
563563
/// # use gdal::{Driver, LayerOptions};
564564
/// # use gdal::spatial_ref::SpatialRef;
565-
/// # let driver = Driver::get("GPKG").unwrap();
565+
/// # let driver = Driver::get_by_name("GPKG").unwrap();
566566
/// # let mut dataset = driver.create_vector_only("/vsimem/example.gpkg").unwrap();
567567
/// let roads = dataset.create_layer(LayerOptions {
568568
/// name: "roads",
@@ -720,7 +720,7 @@ impl Dataset {
720720
/// }
721721
/// #
722722
/// # fn main() -> gdal::errors::Result<()> {
723-
/// # let driver = gdal::Driver::get("SQLite")?;
723+
/// # let driver = gdal::Driver::get_by_name("SQLite")?;
724724
/// # let mut dataset = driver.create_vector_only(":memory:")?;
725725
/// # create_point_grid(&mut dataset)?;
726726
/// # assert_eq!(dataset.layer(0)?.features().count(), 10000);

src/driver.rs

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ pub struct Driver {
3030
}
3131

3232
impl Driver {
33-
pub fn get(name: &str) -> Result<Driver> {
33+
/// Returns the driver with the given short name.
34+
pub fn get_by_name(name: &str) -> Result<Driver> {
3435
_register_drivers();
3536
let c_name = CString::new(name)?;
3637
let c_driver = unsafe { gdal_sys::GDALGetDriverByName(c_name.as_ptr()) };
@@ -40,6 +41,24 @@ impl Driver {
4041
Ok(Driver { c_driver })
4142
}
4243

44+
/// Returns the driver with the given index, which must be less than the value returned by
45+
/// `Driver::count()`.
46+
pub fn get(index: usize) -> Result<Driver> {
47+
_register_drivers();
48+
let c_driver = unsafe { gdal_sys::GDALGetDriver(index.try_into().unwrap()) };
49+
if c_driver.is_null() {
50+
return Err(_last_null_pointer_err("GDALGetDriver"));
51+
}
52+
Ok(Driver { c_driver })
53+
}
54+
55+
/// Returns the number of registered drivers.
56+
pub fn count() -> usize {
57+
_register_drivers();
58+
let count = unsafe { gdal_sys::GDALGetDriverCount() };
59+
count.try_into().unwrap()
60+
}
61+
4362
/// Creates a new Driver object by wrapping a C pointer
4463
///
4564
/// # Safety

src/raster/tests.rs

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ fn test_read_raster_with_average_resample() {
121121

122122
#[test]
123123
fn test_write_raster() {
124-
let driver = Driver::get("MEM").unwrap();
124+
let driver = Driver::get_by_name("MEM").unwrap();
125125
let dataset = driver.create("", 20, 10, 1).unwrap();
126126

127127
// create a 2x1 raster
@@ -153,7 +153,7 @@ fn test_rename_remove_raster() {
153153
let mem_file_path_a = Path::new("/vsimem/030bd1d1-8955-4604-8e37-177dade13863");
154154
let mem_file_path_b = Path::new("/vsimem/c7bfce32-2474-48fa-a907-2af95f83c824");
155155

156-
let driver = Driver::get("GTiff").unwrap();
156+
let driver = Driver::get_by_name("GTiff").unwrap();
157157

158158
dataset.create_copy(&driver, &mem_file_path_a, &[]).unwrap();
159159

@@ -179,7 +179,7 @@ fn test_get_dataset_driver() {
179179

180180
#[test]
181181
fn test_get_description() {
182-
let driver = Driver::get("mem").unwrap();
182+
let driver = Driver::get_by_name("mem").unwrap();
183183
assert_eq!(driver.description().unwrap(), "MEM".to_string());
184184
}
185185

@@ -230,7 +230,7 @@ fn test_get_metadata_item() {
230230

231231
#[test]
232232
fn test_set_metadata_item() {
233-
let driver = Driver::get("MEM").unwrap();
233+
let driver = Driver::get_by_name("MEM").unwrap();
234234
let mut dataset = driver.create("", 1, 1, 1).unwrap();
235235

236236
let key = "Test_Key";
@@ -245,7 +245,7 @@ fn test_set_metadata_item() {
245245

246246
#[test]
247247
fn test_set_description() {
248-
let driver = Driver::get("MEM").unwrap();
248+
let driver = Driver::get_by_name("MEM").unwrap();
249249
let dataset = driver.create("", 1, 1, 1).unwrap();
250250
let mut band = dataset.rasterband(1).unwrap();
251251

@@ -258,7 +258,7 @@ fn test_set_description() {
258258

259259
#[test]
260260
fn test_create() {
261-
let driver = Driver::get("MEM").unwrap();
261+
let driver = Driver::get_by_name("MEM").unwrap();
262262
let dataset = driver.create("", 10, 20, 3).unwrap();
263263
assert_eq!(dataset.raster_size(), (10, 20));
264264
assert_eq!(dataset.raster_count(), 3);
@@ -267,7 +267,7 @@ fn test_create() {
267267

268268
#[test]
269269
fn test_create_with_band_type() {
270-
let driver = Driver::get("MEM").unwrap();
270+
let driver = Driver::get_by_name("MEM").unwrap();
271271
let dataset = driver
272272
.create_with_band_type::<f32, _>("", 10, 20, 3)
273273
.unwrap();
@@ -280,7 +280,7 @@ fn test_create_with_band_type() {
280280

281281
#[test]
282282
fn test_create_with_band_type_with_options() {
283-
let driver = Driver::get("GTiff").unwrap();
283+
let driver = Driver::get_by_name("GTiff").unwrap();
284284
let options = [
285285
RasterCreationOption {
286286
key: "TILED",
@@ -327,7 +327,7 @@ fn test_create_with_band_type_with_options() {
327327

328328
#[test]
329329
fn test_create_copy() {
330-
let driver = Driver::get("MEM").unwrap();
330+
let driver = Driver::get_by_name("MEM").unwrap();
331331
let dataset = Dataset::open(fixture!("tinymarble.png")).unwrap();
332332
let copy = dataset.create_copy(&driver, "", &[]).unwrap();
333333
assert_eq!(copy.raster_size(), (100, 50));
@@ -347,7 +347,7 @@ fn test_create_copy_with_options() {
347347

348348
let copy = dataset
349349
.create_copy(
350-
&Driver::get("GTiff").unwrap(),
350+
&Driver::get_by_name("GTiff").unwrap(),
351351
mem_file_path,
352352
&[
353353
RasterCreationOption {
@@ -376,7 +376,7 @@ fn test_create_copy_with_options() {
376376
#[test]
377377
#[allow(clippy::float_cmp)]
378378
fn test_geo_transform() {
379-
let driver = Driver::get("MEM").unwrap();
379+
let driver = Driver::get_by_name("MEM").unwrap();
380380
let mut dataset = driver.create("", 20, 10, 1).unwrap();
381381
let transform = [0., 1., 0., 0., 0., 1.];
382382
assert!(dataset.set_geo_transform(&transform).is_ok());
@@ -385,10 +385,10 @@ fn test_geo_transform() {
385385

386386
#[test]
387387
fn test_get_driver_by_name() {
388-
let missing_driver = Driver::get("wtf");
388+
let missing_driver = Driver::get_by_name("wtf");
389389
assert!(missing_driver.is_err());
390390

391-
let ok_driver = Driver::get("GTiff");
391+
let ok_driver = Driver::get_by_name("GTiff");
392392
assert!(ok_driver.is_ok());
393393
let driver = ok_driver.unwrap();
394394
assert_eq!(driver.short_name(), "GTiff");
@@ -486,15 +486,15 @@ fn test_read_block_data() {
486486

487487
#[test]
488488
fn test_get_band_type() {
489-
let driver = Driver::get("MEM").unwrap();
489+
let driver = Driver::get_by_name("MEM").unwrap();
490490
let dataset = driver.create("", 20, 10, 1).unwrap();
491491
let rb = dataset.rasterband(1).unwrap();
492492
assert_eq!(rb.band_type(), GDALDataType::GDT_Byte);
493493
}
494494

495495
#[test]
496496
fn test_get_rasterband() {
497-
let driver = Driver::get("MEM").unwrap();
497+
let driver = Driver::get_by_name("MEM").unwrap();
498498
let dataset = driver.create("", 20, 10, 1).unwrap();
499499
let rasterband = dataset.rasterband(1);
500500
assert!(rasterband.is_ok());
@@ -518,7 +518,7 @@ fn test_get_no_data_value() {
518518
#[test]
519519
#[allow(clippy::float_cmp)]
520520
fn test_set_no_data_value() {
521-
let driver = Driver::get("MEM").unwrap();
521+
let driver = Driver::get_by_name("MEM").unwrap();
522522
let dataset = driver.create("", 20, 10, 1).unwrap();
523523
let mut rasterband = dataset.rasterband(1).unwrap();
524524
assert_eq!(rasterband.no_data_value(), None);
@@ -648,7 +648,7 @@ fn test_get_rasterband_color_interp() {
648648

649649
#[test]
650650
fn test_set_rasterband_color_interp() {
651-
let driver = Driver::get("MEM").unwrap();
651+
let driver = Driver::get_by_name("MEM").unwrap();
652652
let dataset = driver.create("", 1, 1, 1).unwrap();
653653
let mut rasterband = dataset.rasterband(1).unwrap();
654654
rasterband
@@ -678,7 +678,7 @@ fn test_rasterize() {
678678

679679
let rows = 5;
680680
let cols = 5;
681-
let driver = Driver::get("MEM").unwrap();
681+
let driver = Driver::get_by_name("MEM").unwrap();
682682
let mut dataset = driver.create("", rows, cols, 1).unwrap();
683683

684684
let bands = [1];

src/vector/vector_tests/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -672,7 +672,7 @@ mod tests {
672672
use std::fs;
673673

674674
{
675-
let driver = Driver::get("GeoJSON").unwrap();
675+
let driver = Driver::get_by_name("GeoJSON").unwrap();
676676
let mut ds = driver
677677
.create_vector_only(&fixture!("output.geojson"))
678678
.unwrap();

0 commit comments

Comments
 (0)