use failure::Error;
use regex::Regex;
use std::{collections::BTreeSet, io};

fn parse(linker_line: &str) -> (BTreeSet<String>, BTreeSet<String>) {
    let lib_path_re = Regex::new(r#"(-Lnative=(\S+))"#).unwrap();
    let captures = lib_path_re.captures_iter(linker_line);
    let lib_paths: BTreeSet<String> = captures.map(|capture| capture[2].to_string()).collect();
    let libs_re = Regex::new(r#"(\s+-l(\S+))"#).unwrap();
    let libs_captures = libs_re.captures_iter(linker_line);
    let libs: BTreeSet<String> = libs_captures.map(|capture| capture[2].to_string()).collect();
    (lib_paths, libs)
}

pub fn extract_linkage_information() -> Result<(), Error> {
    let mut linker_text = String::new();
    io::stdin().read_line(&mut linker_text)?;
    let (lib_paths, libs) = parse(&linker_text);
    println!("library_search_paths = {:#?}", lib_paths);
    println!("additional_static_libraries = {:#?}", libs);
    Ok(())
}

#[cfg(test)]
mod test {
    use super::*;

    #[test]
    fn test_link_parsing() {
        let (lib_paths, libs) = parse(LINKER_LINE);
        assert!(lib_paths.len() > 0);
        assert!(libs.len() > 0);
    }

    const LINKER_LINE: &'static str = r#"[1/128] mkdir -p ./exe.unstripped &&  ../../prebuilt/third_party/rust/mac-x64/bin/rustc --color=always --crate-name spinning_square ../../src/lib/ui/carnelian/examples/spinning_square.rs --crate-type bin --emit=dep-info=./spinning_square.d,link -Zdep-info-omit-d-target -C link-args=--Map="./exe.unstripped/spinning_square.map" --cfg=__rust_toolchain=\"g7iBlBv8Ea_O1W0mxabel89X_OWItx5s22pNG6Y1JQ8C\" --cfg=rust_panic=\"abort\" -L /Users/rob/projects/fuchsia/out/core.x64-release/gen/build/config/fuchsia/lib -Clinker=/Users/rob/projects/fuchsia/prebuilt/third_party/clang/mac-x64/bin/lld -Clink-arg=--sysroot=/Users/rob/projects/fuchsia/out/core.x64-release/gen/build/config/fuchsia -Clink-arg=-L/Users/rob/projects/fuchsia/out/core.x64-release/gen/build/config/fuchsia/lib -Clink-arg=-L/Users/rob/projects/fuchsia/prebuilt/third_party/clang/mac-x64/lib/clang/11.0.0/x86_64-fuchsia/lib -Clink-arg=--pack-dyn-relocs=relr -Clink-arg=-dynamic-linker=ld.so.1 -Clink-arg=--icf=all --remap-path-prefix /Users/rob/projects/fuchsia/=../../ -Copt-level=z -Cdebuginfo=2 --edition=2018 -Zallow-features= --target x86_64-fuchsia --cap-lints=warn -Wrust-2018-idioms -Dwarnings -Clink-args=-zstack-size=0x200000 -Cpanic=abort -Cforce-unwind-tables=yes -Zpanic_abort_tests -o "./exe.unstripped/spinning_square" -Ldependency=obj/garnet/examples/fidl/services -Ldependency=obj/src/lib/fidl/rust/fidl -Ldependency=obj/src/lib/zerocopy -Ldependency=host_x64 -Ldependency=obj/third_party/rust_crates -Ldependency=obj/src/lib/zircon/rust -Ldependency=obj/src/lib/fuchsia-async -Ldependency=obj/src/lib/fuchsia-system-alloc -Ldependency=obj/sdk/fidl/fuchsia.ui.input -Ldependency=obj/sdk/fidl/fuchsia.ui.input2 -Ldependency=obj/sdk/fidl/fuchsia.ui.views -Ldependency=obj/zircon/vdso/zx -Ldependency=obj/sdk/fidl/fuchsia.ui.input3 -Ldependency=obj/sdk/fidl/fuchsia.input -Ldependency=obj/src/lib/trace/rust -Ldependency=obj/src/lib/cstr -Ldependency=obj/src/lib/ui/carnelian -Ldependency=obj/sdk/fidl/fuchsia.fonts -Ldependency=obj/sdk/fidl/fuchsia.intl -Ldependency=obj/sdk/fidl/fuchsia.mem -Ldependency=obj/sdk/fidl/fuchsia.hardware.input -Ldependency=obj/sdk/fidl/fuchsia.images -Ldependency=obj/sdk/fidl/fuchsia.sysmem -Ldependency=obj/sdk/fidl/fuchsia.input.report -Ldependency=obj/sdk/fidl/fuchsia.math -Ldependency=obj/sdk/fidl/fuchsia.ui.app -Ldependency=obj/sdk/fidl/fuchsia.sys -Ldependency=obj/sdk/fidl/fuchsia.ui.gfx -Ldependency=obj/sdk/fidl/fuchsia.ui.policy -Ldependency=obj/sdk/fidl/fuchsia.ui.scenic -Ldependency=obj/sdk/fidl/fuchsia.scenic.scheduling -Ldependency=obj/src/graphics/lib/compute/mold -Ldependency=obj/src/graphics/lib/compute/surpass -Ldependency=obj/src/graphics/lib/compute/spinel-rs-sys -Ldependency=obj/src/lib/fdio/rust -Ldependency=obj/sdk/fidl/fuchsia.device -Ldependency=obj/sdk/fidl/fuchsia.device.manager -Ldependency=obj/src/lib/fuchsia-runtime -Ldependency=obj/src/lib/fuchsia-component -Ldependency=obj/garnet/lib/rust/io_util -Ldependency=obj/sdk/fidl/fuchsia.io -Ldependency=obj/sdk/fidl/fuchsia.sys2 -Ldependency=obj/sdk/fidl/fuchsia.component -Ldependency=obj/sdk/fidl/fuchsia.data -Ldependency=obj/sdk/fidl/fuchsia.io2 -Ldependency=obj/sdk/fidl/fuchsia.url -Ldependency=obj/src/lib/mapped-vmo -Ldependency=obj/src/lib/shared-buffer -Ldependency=obj/src/lib/syslog/rust -Ldependency=obj/sdk/fidl/fuchsia.logger -Ldependency=obj/src/lib/ui/fuchsia-framebuffer -Ldependency=obj/sdk/fidl/fuchsia.hardware.display -Ldependency=obj/src/lib/ui/fuchsia-scenic -Ldependency=obj/src/lib/ui/input-synthesis -Lnative=x64-shared -Lnative=obj/zircon/system/ulib/trace-provider -Lnative=obj/zircon/public/lib/async -Lnative=obj/zircon/public/lib/fit -Lnative=obj/zircon/public/lib/zx -Lnative=obj/zircon/public/lib/fidl -Lnative=obj/zircon/public/lib/fidl_base -Lnative=obj/zircon/public/lib/async-cpp -Lnative=obj/src/graphics/lib/compute/common -Lnative=obj/src/graphics/lib/compute/common/vk -Lnative=obj/src/graphics/lib/compute/hotsort/platforms/vk -Lnative=obj/src/graphics/lib/compute/spinel -Lnative=obj/src/graphics/lib/compute/spinel/platforms/vk -Lnative=obj/src/graphics/lib/compute/spinel/platforms/vk/targets/vendors/amd/gcn3 -Lnative=obj/src/graphics/lib/compute/spinel/platforms/vk/targets/vendors/amd/gcn3/hotsort -Lnative=obj/src/graphics/lib/compute/spinel/platforms/vk/targets/vendors/arm/bifrost8 -Lnative=obj/src/graphics/lib/compute/spinel/platforms/vk/targets/vendors/arm/bifrost8/hotsort -Lnative=obj/src/graphics/lib/compute/spinel/platforms/vk/targets/vendors/intel/gen8 -Lnative=obj/src/graphics/lib/compute/spinel/platforms/vk/targets/vendors/intel/gen8/hotsort -Lnative=obj/src/graphics/lib/compute/spinel/platforms/vk/targets/vendors/nvidia/sm50 -Lnative=obj/src/graphics/lib/compute/spinel/platforms/vk/targets/vendors/nvidia/sm50/hotsort -ltrace-engine -lrust-trace-provider -ltrace-provider-with-fdio -lasync -lfit -lzx -lfdio -lfidl -lfidl_base -lasync-cpp -lasync-default -lsyslog -lcompute_common -lcompute_common_vk -lvulkan -lhotsort_vk -lspinel -lspinel_vk -lspinel_vk_find_target -lspinel_vk_spn_amd_gcn3 -lhotsort_vk_hs_amd_gcn3_u64 -lspinel_vk_spn_arm_bifrost8 -lhotsort_vk_hs_arm_bifrost8_u64 -lspinel_vk_spn_intel_gen8 -lhotsort_vk_hs_intel_gen8_u64 -lspinel_vk_spn_nvidia_sm50 -lhotsort_vk_hs_nvidia_sm35_u64 -Lnative=gen/zircon/system/ulib/fdio -Lnative=gen/zircon/system/ulib/trace-engine -Lnative=gen/zircon/system/ulib/syslog -lzircon --extern fidl_fidl_examples_echo=obj/garnet/examples/fidl/services/libfidl_fidl_examples_echo.rlib --extern fidl_fuchsia_ui_input=obj/sdk/fidl/fuchsia.ui.input/libfidl_fuchsia_ui_input.rlib --extern fidl=obj/src/lib/fidl/rust/fidl/libfidl.rlib --extern fuchsia_async=obj/src/lib/fuchsia-async/libfuchsia_async.rlib --extern fuchsia_trace=obj/src/lib/trace/rust/libfuchsia_trace.rlib --extern fuchsia_trace_provider=obj/src/lib/trace/rust/libfuchsia_trace_provider.rlib --extern carnelian=obj/src/lib/ui/carnelian/libcarnelian.rlib --extern fuchsia_scenic=obj/src/lib/ui/fuchsia-scenic/libfuchsia_scenic.rlib --extern fuchsia_zircon=obj/src/lib/zircon/rust/libfuchsia_zircon.rlib --extern anyhow=obj/third_party/rust_crates/libanyhow-7791292ca6d4cc50.rlib --extern euclid=obj/third_party/rust_crates/libeuclid-4687831aa0edfe47.rlib --extern futures=obj/third_party/rust_crates/libfutures-db6a965543caf277.rlib --extern thiserror=obj/third_party/rust_crates/libthiserror-eafe64cb9fc967f6.rlib && ../../prebuilt/third_party/clang/mac-x64/bin/llvm-objcopy --strip-sections "./exe.unstripped/spinning_square" "./spinning_square" && ../../prebuilt/tools/buildidtool/mac-x64/buildidtool -build-id-dir .build-id -stamp "./spinning_square.build-id.stamp" -entry "=./spinning_square" -entry ".debug=./exe.unstripped/spinning_square"
"#;
}
