}
fn normalize(lib: &Option<~[SerializedLibTarget]>, bin: &Option<~[SerializedExecTarget]>) -> (~[LibTarget], ~[ExecTarget]) {
- if lib.is_some() && bin.is_some() {
- let l = lib.clone().unwrap()[0];
- let mut path = l.path.clone();
+ fn lib_targets(libs: &[SerializedLibTarget]) -> ~[LibTarget] {
+ let l = &lib[0];
+ let path = l.path.clone().unwrap_or_else(|| format!("src/{}.rs", l.name));
+ ~[LibTarget{ path: path, name: l.name.clone() }]
+ }
- if path.is_none() {
- path = Some(format!("src/{}.rs", l.name));
- }
+ fn bin_targets(bins: &[SerializedExecTarget], default: |&SerializedExecTarget| -> ~str) -> ~[ExecTarget] {
+ bins.map(|bin| {
+ let path = bin.path.clone().unwrap_or_else(|| default(bin));
+ ExecTarget{ path: path, name: bin.name.clone() }
+ })
+ }
- let b = bin.get_ref().map(|b_ref| {
- let b = b_ref.clone();
- let mut path = b.path.clone();
- if path.is_none() {
- path = Some(format!("src/bin/{}.rs", b.name.clone()));
- }
- ExecTarget{ path: path.unwrap(), name: b.name }
- });
- (~[LibTarget{ path: path.unwrap(), name: l.name }], b)
- } else if lib.is_some() {
- let l = lib.clone().unwrap()[0];
- let mut path = l.path.clone();
-
- if path.is_none() {
- path = Some(format!("src/{}.rs", l.name));
+ match (lib, bin) {
+ (&Some(ref libs), &Some(ref bins)) => {
+ (lib_targets(libs.as_slice()), bin_targets(bins.as_slice(), |bin| format!("src/bin/{}.rs", bin.name)))
+ },
+ (&Some(ref libs), &None) => {
+ (lib_targets(libs.as_slice()), ~[])
+ },
+ (&None, &Some(ref bins)) => {
+ (~[], bin_targets(bins.as_slice(), |bin| format!("src/{}.rs", bin.name)))
+ },
+ (&None, &None) => {
+ (~[], ~[])
}
-
- (~[LibTarget{ path: path.unwrap(), name: l.name }], ~[])
- } else if bin.is_some() {
- let b = bin.get_ref().map(|b_ref| {
- let b = b_ref.clone();
- let mut path = b.path.clone();
- if path.is_none() {
- path = Some(format!("src/{}.rs", b.name.clone()));
- }
- ExecTarget{ path: path.unwrap(), name: b.name }
- });
- (~[], b)
- } else {
- (~[], ~[])
}
}