-
Notifications
You must be signed in to change notification settings - Fork 6
Expand file tree
/
Copy pathcodes_set.rs
More file actions
151 lines (114 loc) · 3.29 KB
/
codes_set.rs
File metadata and controls
151 lines (114 loc) · 3.29 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
#![allow(non_camel_case_types)]
#![allow(clippy::module_name_repetitions)]
use std::ffi::CString;
use eccodes_sys::codes_handle;
use num_traits::FromPrimitive;
use crate::{
errors::{CodesError, CodesInternal},
pointer_guard,
};
pub unsafe fn codes_set_long(
handle: *mut codes_handle,
key: &str,
value: i64,
) -> Result<(), CodesError> {
pointer_guard::non_null!(handle);
let key = CString::new(key).unwrap();
let error_code = eccodes_sys::codes_set_long(handle, key.as_ptr(), value);
if error_code != 0 {
let err: CodesInternal = FromPrimitive::from_i32(error_code).unwrap();
return Err(err.into());
}
Ok(())
}
pub unsafe fn codes_set_double(
handle: *mut codes_handle,
key: &str,
value: f64,
) -> Result<(), CodesError> {
pointer_guard::non_null!(handle);
let key = CString::new(key).unwrap();
let error_code = eccodes_sys::codes_set_double(handle, key.as_ptr(), value);
if error_code != 0 {
let err: CodesInternal = FromPrimitive::from_i32(error_code).unwrap();
return Err(err.into());
}
Ok(())
}
pub unsafe fn codes_set_long_array(
handle: *mut codes_handle,
key: &str,
values: &[i64],
) -> Result<(), CodesError> {
pointer_guard::non_null!(handle);
let key = CString::new(key).unwrap();
let length = values.len();
let error_code = eccodes_sys::codes_set_long_array(
handle,
key.as_ptr(),
values.as_ptr().cast::<_>(),
length,
);
if error_code != 0 {
let err: CodesInternal = FromPrimitive::from_i32(error_code).unwrap();
return Err(err.into());
}
Ok(())
}
pub unsafe fn codes_set_double_array(
handle: *mut codes_handle,
key: &str,
values: &[f64],
) -> Result<(), CodesError> {
pointer_guard::non_null!(handle);
let key = CString::new(key).unwrap();
let length = values.len();
let error_code = eccodes_sys::codes_set_double_array(
handle,
key.as_ptr(),
values.as_ptr().cast::<_>(),
length,
);
if error_code != 0 {
let err: CodesInternal = FromPrimitive::from_i32(error_code).unwrap();
return Err(err.into());
}
Ok(())
}
pub unsafe fn codes_set_string(
handle: *mut codes_handle,
key: &str,
value: &str,
) -> Result<(), CodesError> {
pointer_guard::non_null!(handle);
let key = CString::new(key).unwrap();
let mut length = value.len();
let value = CString::new(value).unwrap();
let error_code =
eccodes_sys::codes_set_string(handle, key.as_ptr(), value.as_ptr(), &raw mut length);
if error_code != 0 {
let err: CodesInternal = FromPrimitive::from_i32(error_code).unwrap();
return Err(err.into());
}
Ok(())
}
pub unsafe fn codes_set_bytes(
handle: *mut codes_handle,
key: &str,
values: &[u8],
) -> Result<(), CodesError> {
pointer_guard::non_null!(handle);
let key = CString::new(key).unwrap();
let mut length = values.len();
let error_code = eccodes_sys::codes_set_bytes(
handle,
key.as_ptr(),
values.as_ptr().cast::<_>(),
&raw mut length,
);
if error_code != 0 {
let err: CodesInternal = FromPrimitive::from_i32(error_code).unwrap();
return Err(err.into());
}
Ok(())
}