]> git.proxmox.com Git - rustc.git/blame - library/std/src/sys/wasi/args.rs
New upstream version 1.48.0~beta.8+dfsg1
[rustc.git] / library / std / src / sys / wasi / args.rs
CommitLineData
1b1a35ee
XL
1#![deny(unsafe_op_in_unsafe_fn)]
2
60c5eb7d 3use crate::ffi::{CStr, OsStr, OsString};
532ac7d7 4use crate::marker::PhantomData;
60c5eb7d 5use crate::os::wasi::ffi::OsStrExt;
532ac7d7
XL
6use crate::vec;
7
60c5eb7d 8pub unsafe fn init(_argc: isize, _argv: *const *const u8) {}
e1599b0c 9
60c5eb7d 10pub unsafe fn cleanup() {}
532ac7d7
XL
11
12pub struct Args {
13 iter: vec::IntoIter<OsString>,
14 _dont_send_or_sync_me: PhantomData<*mut ()>,
15}
16
17/// Returns the command line arguments
18pub fn args() -> Args {
e1599b0c 19 Args {
60c5eb7d
XL
20 iter: maybe_args().unwrap_or(Vec::new()).into_iter(),
21 _dont_send_or_sync_me: PhantomData,
22 }
23}
24
25fn maybe_args() -> Option<Vec<OsString>> {
26 unsafe {
27 let (argc, buf_size) = wasi::args_sizes_get().ok()?;
28 let mut argv = Vec::with_capacity(argc);
29 let mut buf = Vec::with_capacity(buf_size);
30 wasi::args_get(argv.as_mut_ptr(), buf.as_mut_ptr()).ok()?;
31 argv.set_len(argc);
32 let mut ret = Vec::with_capacity(argc);
33 for ptr in argv {
34 let s = CStr::from_ptr(ptr.cast());
35 ret.push(OsStr::from_bytes(s.to_bytes()).to_owned());
36 }
37 Some(ret)
532ac7d7
XL
38 }
39}
40
41impl Args {
42 pub fn inner_debug(&self) -> &[OsString] {
43 self.iter.as_slice()
44 }
45}
46
47impl Iterator for Args {
48 type Item = OsString;
49 fn next(&mut self) -> Option<OsString> {
50 self.iter.next()
51 }
52 fn size_hint(&self) -> (usize, Option<usize>) {
53 self.iter.size_hint()
54 }
55}
56
57impl ExactSizeIterator for Args {
58 fn len(&self) -> usize {
59 self.iter.len()
60 }
61}
62
63impl DoubleEndedIterator for Args {
64 fn next_back(&mut self) -> Option<OsString> {
65 self.iter.next_back()
66 }
67}