Skip to content

Commit 10e75ab

Browse files
Auto-merge for PR #110 via VersionBot
Error handling with error-chain
2 parents a016f66 + eab4335 commit 10e75ab

14 files changed

Lines changed: 369 additions & 222 deletions

File tree

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@ All notable changes to this project will be documented in this file
44
automatically by Versionist. DO NOT EDIT THIS FILE MANUALLY!
55
This project adheres to [Semantic Versioning](http://semver.org/).
66

7+
## v0.9.0 - 2018-02-15
8+
9+
* Error handling with error-chain #110 [majorz]
10+
711
## v0.8.6 - 2018-01-10
812

913
* Incomplete NM80211ApFlags enumeration definitions #108 [majorz]

Cargo.toml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "network-manager"
3-
version = "0.8.6"
3+
version = "0.9.0"
44
authors = ["Zahari Petkov <zahari@resin.io>", "Aaron Brodersen <aaron@resin.io>"]
55
description = "Rust NetworkManager bindings"
66
homepage = "https://github.com/resin-io-modules/network-manager"
@@ -17,3 +17,7 @@ tokio-timer = "0.1"
1717
bitflags = "0.9"
1818
ascii = "0.8"
1919
log = "0.3"
20+
21+
[dependencies.error-chain]
22+
version = "0.11"
23+
default-features = false

examples/create.rs

Lines changed: 77 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,97 @@
1+
#[macro_use]
2+
extern crate error_chain;
3+
14
extern crate network_manager;
25

36
use std::env;
47
use std::process;
8+
use std::io::Write;
9+
10+
use network_manager::{AccessPoint, Device, DeviceType, NetworkManager};
11+
12+
mod errors {
13+
use network_manager;
14+
15+
error_chain! {
16+
links {
17+
NetworkManager(network_manager::errors::Error, network_manager::errors::ErrorKind);
18+
}
19+
20+
errors {
21+
Runtime(info: String) {
22+
description("Runtime error")
23+
display("{}", info)
24+
}
25+
}
26+
}
27+
}
528

6-
use network_manager::{DeviceType, NetworkManager};
29+
use errors::*;
730

831
fn main() {
32+
if let Err(ref e) = run() {
33+
let stderr = &mut ::std::io::stderr();
34+
let errmsg = "Error writing to stderr";
35+
36+
writeln!(stderr, "{}", e).expect(errmsg);
37+
38+
for e in e.iter().skip(1) {
39+
writeln!(stderr, " caused by: {}", e).expect(errmsg);
40+
}
41+
42+
::std::process::exit(1);
43+
}
44+
}
45+
46+
fn run() -> Result<()> {
947
let args: Vec<String> = env::args().collect();
1048

11-
if args.len() < 3 {
49+
if args.len() != 3 {
1250
println!("USAGE: create SSID PASSWORD");
1351
process::exit(1);
1452
}
1553

1654
let manager = NetworkManager::new();
1755

18-
let devices = manager.get_devices().unwrap();
19-
let device_index = devices
20-
.iter()
21-
.position(|d| *d.device_type() == DeviceType::WiFi)
22-
.unwrap();
23-
let wifi_device = devices[device_index].as_wifi_device().unwrap();
56+
let device = find_device(&manager)?;
2457

25-
let access_points = wifi_device.get_access_points().unwrap();
58+
let wifi_device = device.as_wifi_device().unwrap();
2659

27-
let ap_index = access_points
60+
let access_points = wifi_device.get_access_points()?;
61+
62+
let ap_index = find_access_point(&access_points, &args[1] as &str)?;
63+
64+
wifi_device.connect(&access_points[ap_index], &args[2] as &str)?;
65+
66+
Ok(())
67+
}
68+
69+
fn find_device(manager: &NetworkManager) -> Result<Device> {
70+
let devices = manager.get_devices()?;
71+
72+
let index = devices
2873
.iter()
29-
.position(|ap| ap.ssid().as_str().unwrap() == args[1])
30-
.unwrap();
74+
.position(|d| *d.device_type() == DeviceType::WiFi);
3175

32-
wifi_device
33-
.connect(&access_points[ap_index], &args[2] as &str)
34-
.unwrap();
76+
if let Some(index) = index {
77+
Ok(devices[index].clone())
78+
} else {
79+
bail!(ErrorKind::Runtime("Cannot find a WiFi device".into()))
80+
}
81+
}
82+
83+
fn find_access_point(access_points: &[AccessPoint], ssid: &str) -> Result<usize> {
84+
if let Some(index) = access_points.iter().position(|ap| same_ssid(ap, ssid)) {
85+
Ok(index)
86+
} else {
87+
bail!(ErrorKind::Runtime("Access point not found".into()))
88+
}
89+
}
90+
91+
fn same_ssid(ap: &AccessPoint, ssid: &str) -> bool {
92+
if let Ok(ap_ssid) = ap.ssid().as_str() {
93+
ap_ssid == ssid
94+
} else {
95+
false
96+
}
3597
}

examples/hotspot.rs

Lines changed: 73 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,74 @@
1+
#[macro_use]
2+
extern crate error_chain;
3+
14
extern crate network_manager;
25

36
use std::env;
47
use std::process;
8+
use std::io::Write;
59

610
use network_manager::{Device, DeviceType, NetworkManager};
711

12+
mod errors {
13+
use network_manager;
14+
15+
error_chain! {
16+
links {
17+
NetworkManager(network_manager::errors::Error, network_manager::errors::ErrorKind);
18+
}
19+
20+
errors {
21+
Runtime(info: String) {
22+
description("Runtime error")
23+
display("{}", info)
24+
}
25+
}
26+
}
27+
}
28+
29+
use errors::*;
30+
831
struct Options {
932
interface: Option<String>,
1033
ssid: String,
1134
password: Option<String>,
1235
}
1336

14-
fn print_usage_and_exit() {
15-
println!("USAGE: hotspot [-i INTERFACE] SSID [PASSWORD]");
16-
process::exit(1);
37+
fn main() {
38+
if let Err(ref e) = run() {
39+
let stderr = &mut ::std::io::stderr();
40+
let errmsg = "Error writing to stderr";
41+
42+
writeln!(stderr, "{}", e).expect(errmsg);
43+
44+
for e in e.iter().skip(1) {
45+
writeln!(stderr, " caused by: {}", e).expect(errmsg);
46+
}
47+
48+
::std::process::exit(1);
49+
}
50+
}
51+
52+
fn run() -> Result<()> {
53+
let Options {
54+
interface,
55+
ssid,
56+
password,
57+
} = parse_options();
58+
59+
let pass_str = match password {
60+
Some(ref s) => Some(s as &str),
61+
None => None,
62+
};
63+
64+
let manager = NetworkManager::new();
65+
66+
let device = find_device(&manager, interface)?;
67+
let wifi_device = device.as_wifi_device().unwrap();
68+
69+
wifi_device.create_hotspot(&ssid as &str, pass_str, None)?;
70+
71+
Ok(())
1772
}
1873

1974
fn parse_options() -> Options {
@@ -48,48 +103,34 @@ fn parse_options() -> Options {
48103
}
49104
}
50105

51-
fn find_device(manager: &NetworkManager, interface: Option<String>) -> Option<Device> {
106+
fn print_usage_and_exit() {
107+
println!("USAGE: hotspot [-i INTERFACE] SSID [PASSWORD]");
108+
process::exit(1);
109+
}
110+
111+
fn find_device(manager: &NetworkManager, interface: Option<String>) -> Result<Device> {
52112
if let Some(interface) = interface {
53-
let device = manager.get_device_by_interface(&interface).unwrap();
113+
let device = manager.get_device_by_interface(&interface)?;
54114

55115
if *device.device_type() == DeviceType::WiFi {
56-
Some(device)
116+
Ok(device)
57117
} else {
58-
None
118+
bail!(ErrorKind::Runtime(format!(
119+
"{} is not a WiFi device",
120+
interface
121+
)))
59122
}
60123
} else {
61-
let devices = manager.get_devices().unwrap();
124+
let devices = manager.get_devices()?;
62125

63126
let index = devices
64127
.iter()
65128
.position(|d| *d.device_type() == DeviceType::WiFi);
66129

67130
if let Some(index) = index {
68-
Some(devices[index].clone())
131+
Ok(devices[index].clone())
69132
} else {
70-
None
133+
bail!(ErrorKind::Runtime("Cannot find a WiFi device".into()))
71134
}
72135
}
73136
}
74-
75-
fn main() {
76-
let Options {
77-
interface,
78-
ssid,
79-
password,
80-
} = parse_options();
81-
82-
let pass_str = match password {
83-
Some(ref s) => Some(s as &str),
84-
None => None,
85-
};
86-
87-
let manager = NetworkManager::new();
88-
89-
let device = find_device(&manager, interface).unwrap();
90-
let wifi_device = device.as_wifi_device().unwrap();
91-
92-
wifi_device
93-
.create_hotspot(&ssid as &str, pass_str, None)
94-
.unwrap();
95-
}

0 commit comments

Comments
 (0)