github.com/meulengracht/snapd@v0.0.0-20210719210640-8bde69bcc84e/cmd/snap/notes.go (about)

     1  // -*- Mode: Go; indent-tabs-mode: t -*-
     2  
     3  /*
     4   * Copyright (C) 2016 Canonical Ltd
     5   *
     6   * This program is free software: you can redistribute it and/or modify
     7   * it under the terms of the GNU General Public License version 3 as
     8   * published by the Free Software Foundation.
     9   *
    10   * This program is distributed in the hope that it will be useful,
    11   * but WITHOUT ANY WARRANTY; without even the implied warranty of
    12   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    13   * GNU General Public License for more details.
    14   *
    15   * You should have received a copy of the GNU General Public License
    16   * along with this program.  If not, see <http://www.gnu.org/licenses/>.
    17   *
    18   */
    19  
    20  package main
    21  
    22  import (
    23  	"fmt"
    24  	"strings"
    25  
    26  	"github.com/snapcore/snapd/client"
    27  	"github.com/snapcore/snapd/i18n"
    28  	"github.com/snapcore/snapd/snap"
    29  )
    30  
    31  func getPriceString(prices map[string]float64, suggestedCurrency, status string) string {
    32  	price, currency, err := getPrice(prices, suggestedCurrency)
    33  
    34  	// If there are no prices, then the snap is free
    35  	if err != nil {
    36  		return ""
    37  	}
    38  
    39  	// If the snap is priced, but has been purchased
    40  	if status == "available" {
    41  		return i18n.G("bought")
    42  	}
    43  
    44  	return formatPrice(price, currency)
    45  }
    46  
    47  func formatPrice(val float64, currency string) string {
    48  	return fmt.Sprintf("%.2f%s", val, currency)
    49  }
    50  
    51  // Notes encapsulate everything that might be interesting about a
    52  // snap, in order to present a brief summary of it.
    53  type Notes struct {
    54  	SnapType         snap.Type
    55  	Private          bool
    56  	DevMode          bool
    57  	JailMode         bool
    58  	Classic          bool
    59  	TryMode          bool
    60  	Disabled         bool
    61  	Broken           bool
    62  	IgnoreValidation bool
    63  	InCohort         bool
    64  	Health           string
    65  	Price            string
    66  }
    67  
    68  func NotesFromChannelSnapInfo(ref *snap.ChannelSnapInfo) *Notes {
    69  	return &Notes{
    70  		DevMode: ref.Confinement == client.DevModeConfinement,
    71  		Classic: ref.Confinement == client.ClassicConfinement,
    72  	}
    73  }
    74  
    75  func NotesFromRemote(snp *client.Snap, resInfo *client.ResultInfo) *Notes {
    76  	notes := &Notes{
    77  		Private:  snp.Private,
    78  		DevMode:  snp.Confinement == client.DevModeConfinement,
    79  		Classic:  snp.Confinement == client.ClassicConfinement,
    80  		SnapType: snap.Type(snp.Type),
    81  	}
    82  	if resInfo != nil {
    83  		notes.Price = getPriceString(snp.Prices, resInfo.SuggestedCurrency, snp.Status)
    84  	}
    85  
    86  	return notes
    87  }
    88  
    89  func NotesFromLocal(snp *client.Snap) *Notes {
    90  	var health string
    91  	if snp.Health != nil {
    92  		health = snp.Health.Status
    93  	}
    94  	return &Notes{
    95  		SnapType:         snap.Type(snp.Type),
    96  		Private:          snp.Private,
    97  		DevMode:          snp.DevMode,
    98  		Classic:          !snp.JailMode && (snp.Confinement == client.ClassicConfinement),
    99  		JailMode:         snp.JailMode,
   100  		TryMode:          snp.TryMode,
   101  		Disabled:         snp.Status != client.StatusActive,
   102  		Broken:           snp.Broken != "",
   103  		IgnoreValidation: snp.IgnoreValidation,
   104  		InCohort:         snp.CohortKey != "",
   105  		Health:           health,
   106  	}
   107  }
   108  
   109  func (n *Notes) String() string {
   110  	if n == nil {
   111  		return ""
   112  	}
   113  	var ns []string
   114  
   115  	switch n.SnapType {
   116  	case "", snap.TypeApp:
   117  		// nothing
   118  	case snap.TypeOS:
   119  		ns = append(ns, "core")
   120  	default:
   121  		ns = append(ns, string(n.SnapType))
   122  	}
   123  	if n.Disabled {
   124  		// TRANSLATORS: if possible, a single short word
   125  		ns = append(ns, i18n.G("disabled"))
   126  	}
   127  
   128  	if n.Price != "" {
   129  		ns = append(ns, n.Price)
   130  	}
   131  
   132  	if n.DevMode {
   133  		ns = append(ns, "devmode")
   134  	}
   135  
   136  	if n.JailMode {
   137  		ns = append(ns, "jailmode")
   138  	}
   139  
   140  	if n.Classic {
   141  		ns = append(ns, "classic")
   142  	}
   143  
   144  	if n.Private {
   145  		// TRANSLATORS: if possible, a single short word
   146  		ns = append(ns, i18n.G("private"))
   147  	}
   148  
   149  	if n.TryMode {
   150  		ns = append(ns, "try")
   151  	}
   152  
   153  	if n.Broken {
   154  		// TRANSLATORS: if possible, a single short word
   155  		ns = append(ns, i18n.G("broken"))
   156  	}
   157  
   158  	if n.IgnoreValidation {
   159  		ns = append(ns, i18n.G("ignore-validation"))
   160  	}
   161  
   162  	if n.InCohort {
   163  		ns = append(ns, i18n.G("in-cohort"))
   164  	}
   165  	if n.Health != "" && n.Health != "okay" {
   166  		ns = append(ns, n.Health)
   167  	}
   168  
   169  	if len(ns) == 0 {
   170  		return "-"
   171  	}
   172  
   173  	return strings.Join(ns, ",")
   174  }