/* * Copyright (c) 2023 Emma Tebibyte * SPDX-License-Identifier: AGPL-3.0-or-later * * This program is free software: you can redistribute it and/or modify it under * the terms of the GNU Affero General Public License as published by the Free * Software Foundation, either version 3 of the License, or (at your option) any * later version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more * details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see https://www.gnu.org/licenses/. * * This file incorporates work covered by the following copyright and permission * notice: * The Clear BSD License * * Copyright © 2017-2023 David Wildasin * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted (subject to the limitations in the disclaimer * below) provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions, and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions, and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * * Neither the name of the copyright holder nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED * BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ use std::fmt; /// A single option. /// /// For `Opt(x, y)`: /// - `x` is the character representing the option. /// - `y` is `Some` string, or `None` if no argument was expected. /// /// # Example /// /// ``` /// # fn main() -> Result<(), Box> { /// use getopt::Opt; /// /// // args = ["program", "-abc", "foo"]; /// # let args: Vec = vec!["program", "-abc", "foo"] /// # .into_iter() /// # .map(String::from) /// # .collect(); /// let optstring = "ab:c"; /// let mut opts = getopt::Parser::new(&args, optstring); /// /// assert_eq!(Opt('a', None), opts.next().transpose()?.unwrap()); /// assert_eq!(Opt('b', Some("c".to_string())), opts.next().transpose()?.unwrap()); /// assert_eq!(None, opts.next().transpose()?); /// # Ok(()) /// # } /// ``` #[derive(Debug, Eq, Ord, PartialEq, PartialOrd)] pub struct Opt(pub char, pub Option); impl fmt::Display for Opt { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { write!(f, "Opt({:?}, {:?})", self.0, self.1) } }