let parse_package_stanza filter archs extras par =
let parse_arch = parse_architecture archs 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
try
if Option.is_none filter then Some (p ())
else if (Option.get filter) par then Some(p ())
else None
with
|IgnorePackage s -> begin
let n = parse_s ~opt:"?" parse_name "Package" par in
let v = parse_s ~opt:"?" parse_version "Version" par in
let a = parse_s ~opt:"?" parse_version "Architecture" par in
warning "Ignoring Package (%s,%s,%s) : %s" n v a s;
None
end
|ParseError (f,s) -> begin
let n = parse_s ~opt:"?" parse_name "Package" par in
let v = parse_s ~opt:"?" parse_version "Version" par in
let a = parse_s ~opt:"?" parse_version "Architecture" par in
let err = Printf.sprintf "Parser Error in Package (%s,%s,%s) : %s" n v a s in
raise ( ParseError (f,err) )
end