fitsio_sys_bindgen/
lib.rs

1//! This package was automatically generated with [`rust-bindgen`][1] and as such was not
2//! user-generated.
3//!
4//! The functions contained are expected to be used with [`fitsio`][2], a high level API wrapper
5//! around the low level direct C-bindings, though the bindings are complete enough to be usable.
6//!
7//! This code will not be directly documented, and so users should refer to the [`fitsio` C
8//! documentation][3] for usage.
9//!
10//! ## Note about function names
11//!
12//! Unfortunately we must use fits short names throughout. The C-api exposes long names for
13//! functions which are more descriptive, for example `fits_open_file` instead of `ffopen`, but the
14//! symbols available in the library have only short names, and the long names are merely
15//! preprocessor definitions.
16//!
17//! ## Examples
18//!
19//! ```rust
20//! use std::ptr;
21//! use std::ffi;
22//! # use fitsio_sys_bindgen as fitsio_sys;
23//!
24//! # fn main() -> Result<(), Box<dyn std::error::Error>> {
25//! let filename = ffi::CString::new("!/tmp/test.fits").unwrap();
26//! let mut fptr = ptr::null_mut();
27//! let mut status = 0;
28//!
29//! unsafe {
30//!     // Create a new file, clobbering any pre-existing file
31//!     fitsio_sys::ffinit(&mut fptr as *mut *mut _,
32//!         filename.as_ptr(),
33//!         &mut status);
34//!
35//!     // Add an empty primary HDU
36//!     fitsio_sys::ffphps(fptr, 8, 0, ptr::null_mut(), &mut status);
37//!
38//!     // Finally close the file
39//!     fitsio_sys::ffclos(fptr, &mut status);
40//! }
41//!
42//! assert_eq!(status, 0);
43//! # Ok(())
44//! # }
45//! ```
46//!
47//! [1]: https://github.com/servo/rust-bindgen
48//! [2]: https://crates.io/crates/fitsio
49//! [3]: http://heasarc.gsfc.nasa.gov/docs/software/fitsio/c/c_user/cfitsio.html
50
51#![allow(
52    non_upper_case_globals,
53    non_camel_case_types,
54    non_snake_case,
55    improper_ctypes
56)]
57// Prevent clippy from throwing errors in generated code
58#![allow(
59    clippy::unreadable_literal,
60    clippy::transmute_ptr_to_ptr,
61    clippy::redundant_static_lifetimes,
62    clippy::missing_safety_doc,
63    clippy::useless_transmute,
64    clippy::trivially_copy_pass_by_ref,
65    clippy::too_many_arguments,
66    clippy::should_implement_trait,
67    clippy::upper_case_acronyms
68)]
69
70include!(concat!(env!("OUT_DIR"), "/bindings.rs"));
71
72#[cfg(test)]
73mod test {
74    use super::*;
75    use libc::c_char;
76    use std::ffi;
77    use std::ptr;
78
79    #[test]
80    fn raw_opening_an_existing_file() {
81        let mut fptr = ptr::null_mut();
82        let mut status = -1;
83        let c_filename = ffi::CString::new("../testdata/full_example.fits").unwrap();
84
85        unsafe {
86            ffopen(
87                &mut fptr as *mut *mut fitsfile,
88                c_filename.as_ptr(),
89                0,
90                &mut status,
91            );
92            ffclos(fptr, &mut status);
93        }
94
95        assert_eq!(status, 0);
96    }
97
98    #[test]
99    fn raw_creating_a_new_file() {
100        // Set up the test filename
101        let tdir = tempfile::Builder::new()
102            .prefix("fitsio-")
103            .tempdir()
104            .unwrap();
105        let filename = tdir.path().join("test.fits");
106        assert!(!filename.exists());
107
108        let mut fptr = ptr::null_mut();
109        let mut status = 0;
110        let c_filename = ffi::CString::new(filename.to_str().unwrap()).unwrap();
111
112        unsafe {
113            ffinit(
114                &mut fptr as *mut *mut fitsfile,
115                c_filename.as_ptr(),
116                &mut status,
117            );
118        }
119
120        assert!(filename.exists());
121    }
122
123    #[test]
124    fn getting_current_hdu_number() {
125        let mut fptr = ptr::null_mut();
126        let mut status = -1;
127        let c_filename = ffi::CString::new("../testdata/full_example.fits").unwrap();
128        let mut hdu_num = -1;
129
130        unsafe {
131            ffopen(
132                &mut fptr as *mut *mut fitsfile,
133                c_filename.as_ptr(),
134                0,
135                &mut status,
136            );
137            ffghdn(fptr, &mut hdu_num);
138            ffclos(fptr, &mut status);
139        }
140
141        assert_eq!(hdu_num, 1);
142    }
143
144    #[test]
145    fn changing_hdu_by_absolute_number() {
146        let mut fptr = ptr::null_mut();
147        let mut status = -1;
148        let c_filename = ffi::CString::new("../testdata/full_example.fits").unwrap();
149
150        let mut hdu_type = 0;
151        let mut hdu_num = 0;
152
153        unsafe {
154            ffopen(
155                &mut fptr as *mut *mut fitsfile,
156                c_filename.as_ptr(),
157                0,
158                &mut status,
159            );
160            ffmahd(fptr, 2, &mut hdu_type, &mut status);
161            ffghdn(fptr, &mut hdu_num);
162            ffclos(fptr, &mut status);
163        }
164
165        assert_eq!(hdu_num, 2);
166    }
167
168    #[test]
169    fn reading_header_key_value() {
170        let mut fptr = ptr::null_mut();
171        let mut status = -1;
172        let c_filename = ffi::CString::new("../testdata/full_example.fits").unwrap();
173
174        let mut long_value = 0;
175        let mut float_value = 0.0;
176        let mut double_value = 0.0;
177        let keyname = ffi::CString::new("INTTEST").unwrap();
178        let double_keyname = ffi::CString::new("DBLTEST").unwrap();
179        let mut comment: Vec<c_char> = vec![0; 73];
180        unsafe {
181            ffopen(
182                &mut fptr as *mut *mut fitsfile,
183                c_filename.as_ptr(),
184                0,
185                &mut status,
186            );
187            ffgkyj(
188                fptr,
189                keyname.as_ptr(),
190                &mut long_value,
191                ptr::null_mut(),
192                &mut status,
193            );
194            ffgkye(
195                fptr,
196                keyname.as_ptr(),
197                &mut float_value,
198                ptr::null_mut(),
199                &mut status,
200            );
201
202            // Double version is different
203            ffgkyd(
204                fptr,
205                double_keyname.as_ptr(),
206                &mut double_value,
207                comment.as_mut_ptr(),
208                &mut status,
209            );
210            ffclos(fptr, &mut status);
211        }
212
213        assert_eq!(long_value, 42);
214        assert_eq!(float_value, 42.0);
215        assert_eq!(double_value, 3. / 32.);
216
217        // TODO Hacky way of getting a string out. This should be simplified.
218        let comment: Vec<u8> = comment
219            .iter()
220            .map(|&x| x as u8)
221            .filter(|&x| x != 0)
222            .collect();
223        let comment = String::from_utf8(comment).unwrap();
224        assert_eq!(comment, "Double value");
225    }
226
227    // #[test]
228    // fn api_usage() {
229    // use fitsio::FitsFile;
230    //
231    // let mut f = FitsFile::open("../testdata/full_example.fits");
232    // let mut primary_hdu = f.primary_hdu();
233    // let header = primary_hdu.header();
234    // let exposure_time: f32 = header["exposure"];
235    // }
236    //
237}