///|
/// Bio.ExPASy.ScanProsite Demo.
///
/// Demonstrates the port of Biopython's Bio.ExPASy.ScanProsite module:
/// query URL construction (urllib.parse.urlencode quote_plus semantics),
/// parsing of a `` XML document, and the injected-fetch
/// scan path. Everything runs offline against a canned response.
///|
fn main raise {
println("=== 1. Query URL construction (quote_plus semantics) ===")
println(@src.scanprosite_url(seq="MKWVTF"))
println(@src.scanprosite_url(seq="A C+G"))
println(
@src.scanprosite_url(seq="MKWVTF", params=[
("db", "sp"),
("sig", "P-x(2)-G"),
]),
)
println("\n=== 2. Parsing a canned ScanProsite XML response ===")
let record = @src.scanprosite_read(@src.scanprosite_sample_xml())
println("n_match = \{record.n_match}, n_seq = \{record.n_seq}")
for i = 0; i < record.matches.length(); i = i + 1 {
let m = record.matches[i]
println(
" match \{i}: \{m.signature_ac} on \{m.sequence_id} (\{m.sequence_ac}) \{m.start}-\{m.stop}",
)
}
println("\n=== 3. scan() through an injected (offline) fetch ===")
let calls : Array[String] = []
let xml = @src.scanprosite_sample_xml()
let raw = @src.scanprosite_scan(
fetch=fn(url : String, _post : String?) -> String {
calls.push(url)
xml
},
seq="MKWVTF",
params=[("db", "sp")],
)
println("requested URL : \{calls[0]}")
println("response bytes: \{raw.length()}")
println("\n=== 4. Non-xml output is rejected ===")
let err = try {
ignore(@src.scanprosite_url(seq="MKWVTF", output="txt"))
""
} catch {
ScanPrositeError(msg) => msg
}
println("error: \{err}")
}