let parse_package_stanza filter default_arch extras par =
let parse_arch = parse_architecture default_arch in
let p () = {
name = parse_s ~err:"(MISSING NAME)" parse_name "Package" par;
version = parse_s ~err:"(MISSING VERSION)" parse_version "Version" par;
architecture = parse_s ~err:"(MISSING ARCH)" parse_arch "Architecture" par;
multiarch = parse_s ~opt:"None" parse_multiarch "Multi-Arch" par;
source = parse_s ~opt:("",None) parse_source "Source" par;
essential = parse_s ~opt:false parse_bool "Essential" par;
build_essential = parse_s ~opt:false parse_bool "Build-Essential" par;
priority = parse_s ~opt:"" parse_string "Priority" par;
depends = parse_s ~opt:[] ~multi:true parse_vpkgformula "Depends" par;
pre_depends = parse_s ~opt:[] ~multi:true parse_vpkgformula "Pre-Depends" par;
recommends = parse_s ~opt:[] ~multi:true parse_vpkgformula "Recommends" par;
suggests = parse_s ~opt:[] ~multi:true parse_vpkgformula "Suggests" par;
enhances = parse_s ~opt:[] ~multi:true parse_vpkgformula "Enhances" par;
conflicts = parse_s ~opt:[] ~multi:true parse_vpkglist "Conflicts" par;
breaks = parse_s ~opt:[] ~multi:true parse_vpkglist "Breaks" par;
replaces = parse_s ~opt:[] ~multi:true parse_vpkglist "Replaces" par;
provides = parse_s ~opt:[] ~multi:true parse_vpkglist "Provides" par;
extras = parse_e extras par;
}
in
if Option.is_none filter then
begin try Some (p ())
with IgnorePackage s ->
(warning "%s" s; None)
end
else if (Option.get filter) par then Some(p ()) else None