@@ -114,7 +114,8 @@ pub enum Occur {
114
114
pub struct Opt {
115
115
name : Name ,
116
116
hasarg : HasArg ,
117
- occur : Occur
117
+ occur : Occur ,
118
+ aliases : ~[ Opt ] ,
118
119
}
119
120
120
121
fn mkname ( nm : & str ) -> Name {
@@ -127,37 +128,37 @@ fn mkname(nm: &str) -> Name {
127
128
128
129
/// Create an option that is required and takes an argument
129
130
pub fn reqopt ( name : & str ) -> Opt {
130
- return Opt { name : mkname ( name) , hasarg : Yes , occur : Req } ;
131
+ return Opt { name : mkname ( name) , hasarg : Yes , occur : Req , aliases : ~ [ ] } ;
131
132
}
132
133
133
134
/// Create an option that is optional and takes an argument
134
135
pub fn optopt ( name : & str ) -> Opt {
135
- return Opt { name : mkname ( name) , hasarg : Yes , occur : Optional } ;
136
+ return Opt { name : mkname ( name) , hasarg : Yes , occur : Optional , aliases : ~ [ ] } ;
136
137
}
137
138
138
139
/// Create an option that is optional and does not take an argument
139
140
pub fn optflag ( name : & str ) -> Opt {
140
- return Opt { name : mkname ( name) , hasarg : No , occur : Optional } ;
141
+ return Opt { name : mkname ( name) , hasarg : No , occur : Optional , aliases : ~ [ ] } ;
141
142
}
142
143
143
144
/** Create an option that is optional, does not take an argument,
144
145
* and may occur multiple times.
145
146
*/
146
147
pub fn optflagmulti ( name : & str ) -> Opt {
147
- return Opt { name : mkname ( name) , hasarg : No , occur : Multi } ;
148
+ return Opt { name : mkname ( name) , hasarg : No , occur : Multi , aliases : ~ [ ] } ;
148
149
}
149
150
150
151
/// Create an option that is optional and takes an optional argument
151
152
pub fn optflagopt ( name : & str ) -> Opt {
152
- return Opt { name : mkname ( name) , hasarg : Maybe , occur : Optional } ;
153
+ return Opt { name : mkname ( name) , hasarg : Maybe , occur : Optional , aliases : ~ [ ] } ;
153
154
}
154
155
155
156
/**
156
157
* Create an option that is optional, takes an argument, and may occur
157
158
* multiple times
158
159
*/
159
160
pub fn optmulti ( name : & str ) -> Opt {
160
- return Opt { name : mkname ( name) , hasarg : Yes , occur : Multi } ;
161
+ return Opt { name : mkname ( name) , hasarg : Yes , occur : Multi , aliases : ~ [ ] } ;
161
162
}
162
163
163
164
#[ deriving( Clone , Eq ) ]
@@ -189,7 +190,20 @@ fn name_str(nm: &Name) -> ~str {
189
190
}
190
191
191
192
fn find_opt ( opts : & [ Opt ] , nm : Name ) -> Option < uint > {
192
- opts. iter ( ) . position ( |opt| opt. name == nm)
193
+ // search main options
194
+ let pos = opts. iter ( ) . position ( |opt| opt. name == nm) ;
195
+ if pos. is_some ( ) {
196
+ return pos
197
+ }
198
+
199
+ // search in aliases
200
+ for candidate in opts. iter ( ) {
201
+ if candidate. aliases . iter ( ) . position ( |opt| opt. name == nm) . is_some ( ) {
202
+ return opts. iter ( ) . position ( |opt| opt. name == candidate. name ) ;
203
+ }
204
+ }
205
+
206
+ None
193
207
}
194
208
195
209
/**
@@ -488,8 +502,6 @@ pub mod groups {
488
502
use getopts:: { HasArg , Long , Maybe , Multi , No , Occur , Opt , Optional , Req } ;
489
503
use getopts:: { Short , Yes } ;
490
504
491
- use std:: vec;
492
-
493
505
/** one group of options, e.g., both -h and --help, along with
494
506
* their shared description and properties
495
507
*/
@@ -587,40 +599,45 @@ pub mod groups {
587
599
588
600
// translate OptGroup into Opt
589
601
// (both short and long names correspond to different Opts)
590
- pub fn long_to_short ( lopt : & OptGroup ) -> ~ [ Opt ] {
602
+ pub fn long_to_short ( lopt : & OptGroup ) -> Opt {
591
603
let OptGroup { short_name : short_name,
592
604
long_name : long_name,
593
605
hasarg : hasarg,
594
606
occur : occur,
595
607
_} = ( * lopt) . clone ( ) ;
596
608
597
609
match ( short_name. len ( ) , long_name. len ( ) ) {
598
- ( 0 , 0 ) => fail ! ( "this long-format option was given no name" ) ,
599
-
600
- ( 0 , _) => ~[ Opt { name : Long ( ( long_name) ) ,
601
- hasarg : hasarg,
602
- occur : occur} ] ,
603
-
604
- ( 1 , 0 ) => ~[ Opt { name : Short ( short_name. char_at ( 0 ) ) ,
605
- hasarg : hasarg,
606
- occur : occur} ] ,
607
-
608
- ( 1 , _) => ~[ Opt { name : Short ( short_name. char_at ( 0 ) ) ,
609
- hasarg : hasarg,
610
- occur : occur} ,
611
- Opt { name : Long ( ( long_name) ) ,
612
- hasarg : hasarg,
613
- occur : occur} ] ,
614
-
615
- ( _, _) => fail ! ( "something is wrong with the long-form opt" )
610
+ ( 0 , 0 ) => fail ! ( "this long-format option was given no name" ) ,
611
+
612
+ ( 0 , _) => Opt { name : Long ( ( long_name) ) ,
613
+ hasarg : hasarg,
614
+ occur : occur,
615
+ aliases : ~[ ] } ,
616
+
617
+ ( 1 , 0 ) => Opt { name : Short ( short_name. char_at ( 0 ) ) ,
618
+ hasarg : hasarg,
619
+ occur : occur,
620
+ aliases : ~[ ] } ,
621
+
622
+ ( 1 , _) => Opt { name : Long ( ( long_name) ) ,
623
+ hasarg : hasarg,
624
+ occur : occur,
625
+ aliases : ~[ Opt {
626
+ name : Short ( short_name. char_at ( 0 ) ) ,
627
+ hasarg : hasarg,
628
+ occur : occur,
629
+ aliases : ~[ ]
630
+ } ] } ,
631
+
632
+ ( _, _) => fail ! ( "something is wrong with the long-form opt" )
616
633
}
617
634
}
618
635
619
636
/*
620
637
* Parse command line args with the provided long format options
621
638
*/
622
639
pub fn getopts ( args : & [ ~str ] , opts : & [ OptGroup ] ) -> :: getopts:: Result {
623
- :: getopts:: getopts ( args, vec :: flat_map ( opts, long_to_short) )
640
+ :: getopts:: getopts ( args, opts. map ( long_to_short) )
624
641
}
625
642
626
643
/**
@@ -1454,18 +1471,25 @@ mod tests {
1454
1471
1455
1472
#[test]
1456
1473
fn test_groups_long_to_short() {
1457
- let short = ~[reqopt(" b"), reqopt(" banana")];
1474
+ let mut short = reqopt(" banana");
1475
+ short.aliases = ~[reqopt(" b")];
1458
1476
let verbose = groups::reqopt(" b", " banana", " some bananas", " VAL ");
1459
1477
1460
1478
assert_eq!(groups::long_to_short(&verbose), short);
1461
1479
}
1462
1480
1463
1481
#[test]
1464
1482
fn test_groups_getopts() {
1483
+ let mut banana = reqopt(" banana");
1484
+ banana.aliases = ~[reqopt(" b")];
1485
+ let mut apple = optopt(" apple");
1486
+ apple.aliases = ~[optopt(" a")];
1487
+ let mut kiwi = optflag(" kiwi");
1488
+ kiwi.aliases = ~[optflag(" k")];
1465
1489
let short = ~[
1466
- reqopt(" b"), reqopt(" banana") ,
1467
- optopt(" a "), optopt(" apple") ,
1468
- optflag(" k "), optflagopt(" kiwi") ,
1490
+ banana,
1491
+ apple,
1492
+ kiwi,
1469
1493
optflagopt(" p"),
1470
1494
optmulti(" l")
1471
1495
];
@@ -1478,14 +1502,27 @@ mod tests {
1478
1502
groups::optmulti(" l", " ", " Desc ", " VAL "),
1479
1503
];
1480
1504
1481
- let sample_args = ~[~" -k ", ~" 15 ", ~" --apple", ~" 1 ", ~" k",
1505
+ let sample_args = ~[~" --kiwi ", ~" 15 ", ~" --apple", ~" 1 ", ~" k",
1482
1506
~" -p", ~" 16 ", ~" l", ~" 35 "];
1483
1507
1484
1508
// FIXME #4681: sort options here?
1485
1509
assert!(getopts(sample_args, short)
1486
1510
== groups::getopts(sample_args, verbose));
1487
1511
}
1488
1512
1513
+ #[test]
1514
+ fn test_groups_aliases_long_and_short() {
1515
+ let opts = ~[
1516
+ groups::optflagmulti(" a", " apple", " Desc "),
1517
+ ];
1518
+
1519
+ let args = ~[~" -a", ~" --apple", ~" -a"];
1520
+
1521
+ let matches = groups::getopts(args, opts).unwrap();
1522
+ assert_eq!(3, opt_count(&matches, " a"));
1523
+ assert_eq!(3, opt_count(&matches, " apple"));
1524
+ }
1525
+
1489
1526
#[test]
1490
1527
fn test_groups_usage() {
1491
1528
let optgroups = ~[
0 commit comments