go-hep.org/x/hep@v0.38.1/groot/riofs/dir_example_test.go (about)

     1  // Copyright ©2018 The go-hep Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package riofs_test
     6  
     7  import (
     8  	"fmt"
     9  	"log"
    10  	"os"
    11  	stdpath "path"
    12  
    13  	"go-hep.org/x/hep/groot"
    14  	"go-hep.org/x/hep/groot/rbase"
    15  	"go-hep.org/x/hep/groot/riofs"
    16  	"go-hep.org/x/hep/groot/root"
    17  )
    18  
    19  func Example_mkdir() {
    20  	const fname = "../testdata/subdirs.root"
    21  	defer os.Remove(fname)
    22  
    23  	{
    24  		w, err := groot.Create(fname)
    25  		if err != nil {
    26  			log.Fatal(err)
    27  		}
    28  		defer w.Close()
    29  
    30  		dir1, err := w.Mkdir("dir1")
    31  		if err != nil {
    32  			log.Fatal(err)
    33  		}
    34  
    35  		dir11, err := dir1.Mkdir("dir11")
    36  		if err != nil {
    37  			log.Fatal(err)
    38  		}
    39  
    40  		err = dir11.Put("obj1", rbase.NewObjString("data-obj1"))
    41  		if err != nil {
    42  			log.Fatal(err)
    43  		}
    44  
    45  		dir2, err := w.Mkdir("dir2")
    46  		if err != nil {
    47  			log.Fatal(err)
    48  		}
    49  
    50  		err = dir2.Put("obj2", rbase.NewObjString("data-obj2"))
    51  		if err != nil {
    52  			log.Fatal(err)
    53  		}
    54  
    55  		err = w.Close()
    56  		if err != nil {
    57  			log.Fatal(err)
    58  		}
    59  	}
    60  
    61  	r, err := groot.Open(fname)
    62  	if err != nil {
    63  		log.Fatal(err)
    64  	}
    65  	defer r.Close()
    66  
    67  	err = riofs.Walk(r, func(path string, obj root.Object, err error) error {
    68  		fmt.Printf(">> %v\n", path)
    69  		return err
    70  	})
    71  	if err != nil {
    72  		log.Fatalf("could not walk ROOT file: %+v", err)
    73  	}
    74  
    75  	// Output:
    76  	// >> ../testdata/subdirs.root
    77  	// >> ../testdata/subdirs.root/dir1
    78  	// >> ../testdata/subdirs.root/dir1/dir11
    79  	// >> ../testdata/subdirs.root/dir1/dir11/obj1
    80  	// >> ../testdata/subdirs.root/dir2
    81  	// >> ../testdata/subdirs.root/dir2/obj2
    82  }
    83  
    84  func Example_recursivePut() {
    85  	dir, err := os.MkdirTemp("", "groot-riofs-")
    86  	if err != nil {
    87  		log.Fatal(err)
    88  	}
    89  	defer os.RemoveAll(dir)
    90  
    91  	fname := stdpath.Join(dir, "dirs.root")
    92  	f, err := groot.Create(fname)
    93  	if err != nil {
    94  		log.Fatal(err)
    95  	}
    96  	defer f.Close()
    97  
    98  	rd := riofs.Dir(f)
    99  
   100  	// create obj-1, put it under dir1/dir11, create all intermediate directories.
   101  	err = rd.Put("dir1/dir11/obj-1", rbase.NewObjString("obj-1"))
   102  	if err != nil {
   103  		log.Fatal(err)
   104  	}
   105  
   106  	// create obj-2
   107  	err = rd.Put("/dir2/dir22/dir222/obj-2", rbase.NewObjString("obj-2"))
   108  	if err != nil {
   109  		log.Fatal(err)
   110  	}
   111  
   112  	// update obj-1
   113  	err = rd.Put("dir1/dir11/obj-1", rbase.NewObjString("obj-1-1"))
   114  	if err != nil {
   115  		log.Fatal(err)
   116  	}
   117  
   118  	o, err := rd.Get("dir1/dir11/obj-1;1")
   119  	if err != nil {
   120  		log.Fatal(err)
   121  	}
   122  	if got, want := o.(*rbase.ObjString).String(), "obj-1"; got != want {
   123  		log.Fatalf("invalid obj-1;1 value. got=%q, want=%q", got, want)
   124  	}
   125  
   126  	o, err = rd.Get("dir1/dir11/obj-1;2")
   127  	if err != nil {
   128  		log.Fatal(err)
   129  	}
   130  	if got, want := o.(*rbase.ObjString).String(), "obj-1-1"; got != want {
   131  		log.Fatalf("invalid obj-1;1 value. got=%q, want=%q", got, want)
   132  	}
   133  
   134  	o, err = rd.Get("dir1/dir11/obj-1")
   135  	if err != nil {
   136  		log.Fatal(err)
   137  	}
   138  	if got, want := o.(*rbase.ObjString).String(), "obj-1-1"; got != want {
   139  		log.Fatalf("invalid obj-1 value. got=%q, want=%q", got, want)
   140  	}
   141  
   142  	err = riofs.Walk(f, func(path string, obj root.Object, err error) error {
   143  		name := path[len(fname):]
   144  		if name == "" {
   145  			return err
   146  		}
   147  		switch o := obj.(type) {
   148  		case *rbase.ObjString:
   149  			fmt.Printf(">> %v -- value=%q\n", name, o)
   150  		default:
   151  			fmt.Printf(">> %v\n", name)
   152  		}
   153  		return err
   154  	})
   155  	if err != nil {
   156  		log.Fatalf("could not walk ROOT file: %+v", err)
   157  	}
   158  
   159  	err = f.Close()
   160  	if err != nil {
   161  		log.Fatalf("could not close ROOT file: %v", err)
   162  	}
   163  
   164  	// Output:
   165  	// >> /dir1
   166  	// >> /dir1/dir11
   167  	// >> /dir1/dir11/obj-1 -- value="obj-1-1"
   168  	// >> /dir2
   169  	// >> /dir2/dir22
   170  	// >> /dir2/dir22/dir222
   171  	// >> /dir2/dir22/dir222/obj-2 -- value="obj-2"
   172  }
   173  
   174  func Example_recursiveMkdir() {
   175  	dir, err := os.MkdirTemp("", "groot-riofs-")
   176  	if err != nil {
   177  		log.Fatal(err)
   178  	}
   179  	defer os.RemoveAll(dir)
   180  
   181  	fname := stdpath.Join(dir, "dirs.root")
   182  	f, err := groot.Create(fname)
   183  	if err != nil {
   184  		log.Fatal(err)
   185  	}
   186  	defer f.Close()
   187  
   188  	rd := riofs.Dir(f)
   189  
   190  	for _, path := range []string{
   191  		"dir1/dir11/dir111",
   192  		"/dir2/dir22/dir000",
   193  		"dir2/dir22/dir222",
   194  	} {
   195  		_, err = rd.Mkdir(path)
   196  		if err != nil {
   197  			log.Fatal(err)
   198  		}
   199  	}
   200  
   201  	err = rd.Put("/dir1/dir11/obj-1", rbase.NewObjString("obj-1"))
   202  	if err != nil {
   203  		log.Fatal(err)
   204  	}
   205  
   206  	err = riofs.Walk(f, func(path string, obj root.Object, err error) error {
   207  		name := path[len(fname):]
   208  		if name == "" {
   209  			return err
   210  		}
   211  		switch o := obj.(type) {
   212  		case *rbase.ObjString:
   213  			fmt.Printf(">> %v -- value=%q\n", name, o)
   214  		default:
   215  			fmt.Printf(">> %v\n", name)
   216  		}
   217  		return err
   218  	})
   219  	if err != nil {
   220  		log.Fatalf("could not walk ROOT file: %+v", err)
   221  	}
   222  
   223  	err = f.Close()
   224  	if err != nil {
   225  		log.Fatalf("could not close ROOT file: %v", err)
   226  	}
   227  
   228  	// Output:
   229  	// >> /dir1
   230  	// >> /dir1/dir11
   231  	// >> /dir1/dir11/dir111
   232  	// >> /dir1/dir11/obj-1 -- value="obj-1"
   233  	// >> /dir2
   234  	// >> /dir2/dir22
   235  	// >> /dir2/dir22/dir000
   236  	// >> /dir2/dir22/dir222
   237  }