MoonBit-native IPP codec, capability validation and network printing client
Dependencies
moon add liyun6666/moon-ipp@0.1.1import {
"liyun6666/moon-ipp" @ipp,
"liyun6666/moon-ipp/client",
}git clone https://github.com/liyun6666/moon-ipp.git
cd moon-ipp
moon update
moon run cmd/main --target native -- helplet context = @ipp.RequestContext::new("ipp://localhost:8631/ipp/print", user="demo")
let request = context.printer_attributes(1, requested=["printer-name", "document-format-supported"])
let wire = @ipp.encode(request)
let parsed = @ipp.decode(wire)
assert_eq(parsed, request)let transport = @client.HttpTransport::new()
let client = @client.Client::new("ipp://localhost:8631/ipp/print", transport)
let options = @ipp.JobOptions::{
..@ipp.JobOptions::new("Monthly report", "application/pdf"),
sides: Some(@ipp.TwoSidedLongEdge),
}
let job = client.print_job(options, pdf_bytes)
let observations = client.wait_job(job.id)moon run examples/packet --target wasm-gcsudo apt-get install cups-ipp-utils avahi-daemon
sudo systemctl start avahi-daemon
mkdir -p /tmp/moon-ipp-spool
ippeveprinter -n localhost -p 8631 -2 -s 60 \
-f application/pdf,text/plain -d /tmp/moon-ipp-spool -k "Moon IPP Demo"moon run cmd/main --target native -- capabilities --uri ipp://localhost:8631/ipp/print
moon run cmd/main --target native -- print --uri ipp://localhost:8631/ipp/print \
--input examples/report.pdf --name "Monthly report" --sides two-sided-long-edge
# 用上一步输出的 id 替换 1。
moon run cmd/main --target native -- wait --uri ipp://localhost:8631/ipp/print --job-id 1moon run cmd/main --target native -- health --uri ipp://localhost:8631/ipp/print
moon run cmd/main --target native -- jobs --uri ipp://localhost:8631/ipp/print --which all
moon run cmd/main --target native -- create --uri ipp://localhost:8631/ipp/print --format text/plain --name "Cancel me"
# 用 create 输出的 id 替换 2。
moon run cmd/main --target native -- cancel --uri ipp://localhost:8631/ipp/print --job-id 2
moon run cmd/main --target native -- job --uri ipp://localhost:8631/ipp/print --job-id 2python3 scripts/interop_cups.pymoon check --target wasm-gc --deny-warn
moon test --target wasm-gc --deny-warn
moon test --target js --deny-warn
moon check --deny-warn
moon test --deny-warn
moon build --deny-warn
moon info
moon fmt --check
python3 scripts/count_source.py --minimum 4001pub(all) suberror IppError {
Invalid(String)
Truncated(Int, Int)
Limit(String)
Protocol(String)
Unsupported(String)
} derive(Debug)fn Capabilities::choose_format(self : Capabilities, candidates : Array[String]) -> String raise IppErrorfn Capabilities::default_options(self : Capabilities, name : String, format : String) -> JobOptions raise IppErrorfn Capabilities::plan(self : Capabilities, options : JobOptions, document_bytes : Int) -> PrintPlan raise IppErrorfn Capabilities::require_options(self : Capabilities, options : JobOptions, document_bytes? : Int) -> Unit raise IppErrorfn Capabilities::validate_media(self : Capabilities, spec : MediaSpec) -> Array[Diagnostic] raise IppErrorfn Capabilities::validate_options(self : Capabilities, options : JobOptions, document_bytes? : Int) -> Array[Diagnostic] raise IppErrorpub(all) enum IppValue {
Integer(Int)
Enumeration(Int)
Boolean(Bool)
Range(Int, Int)
ResolutionValue(Resolution)
DateTime(IppDateTime)
Text(String)
Name(String)
Keyword(String)
Uri(String)
UriScheme(String)
Charset(String)
Language(String)
MimeType(String)
Octets(Bytes)
TextWithLanguage(String, String)
NameWithLanguage(String, String)
Collection(Array[Attribute])
OutOfBand(Int)
Unknown(Int, Bytes)
} derive(Eq, Debug)fn MediaMargins::new(top : Int, bottom : Int, left : Int, right : Int) -> MediaMargins raise IppErrorpub(all) struct MediaSpec {
size : MediaSize
margins : MediaMargins?
source : String?
kind : String?
name : String?
} derive(Eq, Debug)pub(all) struct PrintPlan {
printer : String
options : JobOptions
document_bytes : Int
diagnostics : Array[Diagnostic]
} derive(Debug)pub(all) struct PrinterHealth {
name : String
state : PrinterState?
accepting_jobs : Bool?
queued_jobs : Int?
reasons : Array[String]
diagnostics : Array[Diagnostic]
} derive(Debug)pub(all) struct RequestContext {
printer : PrinterUri
user : String
language : String
version : Version
} derive(Eq, Debug)fn RequestContext::cancel_job(self : RequestContext, request_id : Int, job_id : Int) -> Message raise IppErrorfn RequestContext::create_job(self : RequestContext, request_id : Int, options : JobOptions) -> Message raise IppErrorfn RequestContext::get_jobs(self : RequestContext, request_id : Int, which? : String, mine? : Bool, limit? : Int) -> Message raise IppErrorfn RequestContext::job_attributes(self : RequestContext, request_id : Int, job_id : Int) -> Message raise IppErrorfn RequestContext::new(uri : String, user? : String, language? : String) -> RequestContext raise IppErrorfn RequestContext::print_job(self : RequestContext, request_id : Int, options : JobOptions, document : Bytes) -> Message raise IppErrorfn RequestContext::printer_attributes(self : RequestContext, request_id : Int, requested? : Array[String]) -> Message raise IppErrorfn RequestContext::send_document(self : RequestContext, request_id : Int, job_id : Int, format : String, document : Bytes, last? : Bool) -> Message raise IppErrorfn RequestContext::validate_job(self : RequestContext, request_id : Int, options : JobOptions) -> Message raise IppErrorfn compare_capabilities(before : Capabilities, after : Capabilities, include_volatile? : Bool) -> Array[CapabilityChange]Install
Download zipMoonBit-native IPP codec, capability validation and network printing client
Dependencies