diff --git a/bindings/rust/libgpiod/examples/gpioset.rs b/bindings/rust/libgpiod/examples/gpioset.rs new file mode 100644 index 000000000000..f72a623ab28c --- /dev/null +++ b/bindings/rust/libgpiod/examples/gpioset.rs @@ -0,0 +1,64 @@ +// SPDX-License-Identifier: Apache-2.0 OR BSD-3-Clause +// +// Copyright 2022 Linaro Ltd. All Rights Reserved. +// Viresh Kumar viresh.kumar@linaro.org +// +// Simplified Rust implementation of the gpioset tool.
+use std::env; +use std::io::{stdin, Read};
+use libgpiod::{
- chip::Chip,
- line::{self, Direction, Offset, SettingVal, Value},
- request, Error, Result,
+};
+fn usage(name: &str) {
- println!("Usage: {} <chip> <line_offset0>=<value0> ...", name);
+}
+fn main() -> Result<()> {
- let args: Vec<String> = env::args().collect();
- if args.len() < 3 {
usage(&args[0]);
return Err(Error::InvalidArguments);
- }
- let lconfig = line::Config::new()?;
- for arg in &args[2..] {
let pair: Vec<&str> = arg.split('=').collect();
if pair.len() != 2 {
usage(&args[0]);
return Err(Error::InvalidArguments);
}
let offset = pair[0]
.parse::<Offset>()
.map_err(|_| Error::InvalidArguments)?;
let value = pair[1]
.parse::<i32>()
.map_err(|_| Error::InvalidArguments)?;
let mut lsettings = line::Settings::new()?;
lsettings.set_prop(&[
SettingVal::Direction(Direction::Output),
SettingVal::OutputValue(Value::new(value)?),
])?;
lconfig.add_line_settings(&[offset], lsettings)?;
- }
I'm looking at it and thinking that it would look much better as:
let settings = line::Settings::new() .set_direction(Direction::Output) .set_output_value(Value::new(value)) .build()?;
settings would not need to be mutable (we'd have some intermediate SettingsBuilder object?) and could be directly passed to add_line_settings()?
We now have chained mutators for LineSettings in C++ and keyword arguments in Python - somehow I think that the former suits rust much better than passing an array of properties.
Bartosz