// Map a localSnap information plus the given active flag to a // map[string]interface{}, augmenting it with the given (purportedly remote) // snap. // // It is a programming error (->panic) to call mapSnap with both arguments // nil. func mapSnap(localSnap *snap.Info, active bool, remoteSnap *snap.Info) map[string]interface{} { var version, icon, name, developer, _type, description, summary string var revision int rollback := -1 update := -1 if localSnap == nil && remoteSnap == nil { panic("no localSnaps & remoteSnap is nil -- how did i even get here") } status := "available" installedSize := int64(-1) downloadSize := int64(-1) var prices map[string]float64 if remoteSnap != nil { prices = remoteSnap.Prices } if localSnap != nil { if active { status = "active" } else { status = "installed" } } var ref *snap.Info if localSnap != nil { ref = localSnap } else { ref = remoteSnap } name = ref.Name() developer = ref.Developer version = ref.Version revision = ref.Revision _type = string(ref.Type) if localSnap != nil { icon = snapIcon(localSnap) summary = localSnap.Summary() description = localSnap.Description() installedSize = localSnap.Size } if remoteSnap != nil { if icon == "" { icon = remoteSnap.IconURL } if description == "" { description = remoteSnap.Description() } if summary == "" { summary = remoteSnap.Summary() } downloadSize = remoteSnap.Size } if localSnap != nil && active { if remoteSnap != nil && revision != remoteSnap.Revision { update = remoteSnap.Revision } // WARNING this'll only get the right* rollback if // only two things can be installed // // *) not the actual right rollback because we aren't // marking things failed etc etc etc) // //if len(localSnaps) == 2 { // rollback = localSnaps[1^idx].Revision() //} } result := map[string]interface{}{ "icon": icon, "name": name, "developer": developer, "status": status, "type": _type, "vendor": "", "revision": revision, "version": version, "description": description, "summary": summary, "installed-size": installedSize, "download-size": downloadSize, } if len(prices) > 0 { result["prices"] = prices } if localSnap != nil { channel := localSnap.Channel if channel != "" { result["channel"] = channel } result["install-date"] = snapDate(localSnap) } if rollback > -1 { result["rollback-available"] = rollback } if update > -1 { result["update-available"] = update } return result }