123module cli45import json6import src.machine7import src.remote8import src.storage9import src.sync1011pub fn cmd_offer(raw []string) int {12 args := parse('offer', raw, Options{13 flags: ['json']14 }) or { return usage_error(err.msg()) }15 store := open_store() or { return refuse(args.json(), err.msg()) }16 defer {17 store.close()18 }19 mut backend := this_machine_backend() or { return refuse(args.json(), err.msg()) }20 report := sync.offer(store, mut backend) or { return refuse(args.json(), err.msg()) }21 if args.json() {22 emit_json(json.encode(OfferedJson{23 repo: report.repo24 saves: report.saves25 objects: report.objects26 events: report.events27 head: report.head28 }))29 return 030 }31 if report.saves + report.objects + report.events == 0 {32 ok('the remote already has everything from [${report.head}]')33 return 034 }35 ok('offered ${report.saves} saves · ${report.objects} objects · ${report.events} events to "${report.repo}"')36 note('remote head is now [${report.head}]')37 return 038}394041pub fn this_machine_backend() !remote.Backend {42 settings := machine.load_remote()!43 if settings.kind == machine.kind_folder {44 return remote.new_folder(settings.path)!45 }46 credentials := machine.load_credentials()!47 return remote.new_s3(settings.endpoint, settings.bucket, settings.region,48 credentials.access_key, credentials.secret_key)!49}50515253pub fn auto_offer(store &storage.Store) {54 if !machine.has_remote() {55 return56 }57 mut backend := this_machine_backend() or {58 note('not offered: ${err.msg()}')59 return60 }61 report := sync.offer(store, mut backend) or {62 note('not offered: ${err.msg()}')63 return64 }65 if report.saves + report.objects + report.events > 0 {66 note('offered to "${report.repo}" — ${report.saves} saves · ${report.objects} objects')67 }68}6970struct OfferedJson {71 repo string72 saves int73 objects int74 events int75 head string76}