github.com/attic-labs/noms@v0.0.0-20210827224422-e5fa29d95e8b/samples/go/hr/main.go (about)

     1  // Copyright 2016 Attic Labs, Inc. All rights reserved.
     2  // Licensed under the Apache License, version 2.0:
     3  // http://www.apache.org/licenses/LICENSE-2.0
     4  
     5  package main
     6  
     7  import (
     8  	"fmt"
     9  	"os"
    10  
    11  	"github.com/attic-labs/kingpin"
    12  
    13  	"github.com/attic-labs/noms/go/config"
    14  	"github.com/attic-labs/noms/go/datas"
    15  	"github.com/attic-labs/noms/go/marshal"
    16  	"github.com/attic-labs/noms/go/types"
    17  	"github.com/attic-labs/noms/go/util/verbose"
    18  )
    19  
    20  func main() {
    21  	app := kingpin.New("hr", "")
    22  	var dsStr = app.Flag("ds", "noms dataset to read/write from").Required().String()
    23  
    24  	addCmd := app.Command("add-person", "Add a new person")
    25  	id := addCmd.Arg("id", "unique person id").Required().Uint64()
    26  	name := addCmd.Arg("name", "person name").Required().String()
    27  	title := addCmd.Arg("title", "person title").Required().String()
    28  
    29  	app.Command("list-persons", "list current persons")
    30  
    31  	verbose.RegisterVerboseFlags(app)
    32  	cmd := kingpin.MustParse(app.Parse(os.Args[1:]))
    33  	cfg := config.NewResolver()
    34  	db, ds, err := cfg.GetDataset(*dsStr)
    35  	if err != nil {
    36  		fmt.Fprintf(os.Stderr, "Could not create dataset: %s\n", err)
    37  		return
    38  	}
    39  	defer db.Close()
    40  
    41  	switch cmd {
    42  	case "add-person":
    43  		addPerson(db, ds, *id, *name, *title)
    44  	case "list-persons":
    45  		listPersons(ds)
    46  	}
    47  }
    48  
    49  type Person struct {
    50  	Name, Title string
    51  	Id          uint64
    52  }
    53  
    54  func addPerson(db datas.Database, ds datas.Dataset, id uint64, name, title string) {
    55  	np, err := marshal.Marshal(db, Person{name, title, id})
    56  	if err != nil {
    57  		fmt.Fprintln(os.Stderr, err)
    58  		return
    59  	}
    60  
    61  	_, err = db.CommitValue(ds, getPersons(ds).Edit().Set(types.Number(id), np).Map())
    62  	if err != nil {
    63  		fmt.Fprintf(os.Stderr, "Error committing: %s\n", err)
    64  		return
    65  	}
    66  }
    67  
    68  func listPersons(ds datas.Dataset) {
    69  	d := getPersons(ds)
    70  	if d.Empty() {
    71  		fmt.Println("No people found")
    72  		return
    73  	}
    74  
    75  	d.IterAll(func(k, v types.Value) {
    76  		var p Person
    77  		err := marshal.Unmarshal(v, &p)
    78  		if err != nil {
    79  			fmt.Fprintln(os.Stderr, err)
    80  			return
    81  		}
    82  		fmt.Printf("%s (id: %d, title: %s)\n", p.Name, p.Id, p.Title)
    83  	})
    84  }
    85  
    86  func getPersons(ds datas.Dataset) types.Map {
    87  	hv, ok := ds.MaybeHeadValue()
    88  	if ok {
    89  		return hv.(types.Map)
    90  	}
    91  	return types.NewMap(ds.Database())
    92  }