format.mx raw

   1  // Copyright 2023 The Go 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 fs
   6  
   7  import (
   8  	"time"
   9  )
  10  
  11  // FormatFileInfo returns a formatted version of info for human readability.
  12  // Implementations of [FileInfo] can call this from a String method.
  13  // The output for a file named "hello.go", 100 bytes, mode 0o644, created
  14  // January 1, 1970 at noon is
  15  //
  16  //	-rw-r--r-- 100 1970-01-01 12:00:00 hello.go
  17  func FormatFileInfo(info FileInfo) []byte {
  18  	name := info.Name()
  19  	b := []byte{:0:40+len(name)}
  20  	b = append(b, info.Mode().String()...)
  21  	b = append(b, ' ')
  22  
  23  	size := info.Size()
  24  	var usize uint64
  25  	if size >= 0 {
  26  		usize = uint64(size)
  27  	} else {
  28  		b = append(b, '-')
  29  		usize = uint64(-size)
  30  	}
  31  	var buf [20]byte
  32  	i := len(buf) - 1
  33  	for usize >= 10 {
  34  		q := usize / 10
  35  		buf[i] = byte('0' + usize - q*10)
  36  		i--
  37  		usize = q
  38  	}
  39  	buf[i] = byte('0' + usize)
  40  	b = append(b, buf[i:]...)
  41  	b = append(b, ' ')
  42  
  43  	b = append(b, info.ModTime().Format(time.DateTime)...)
  44  	b = append(b, ' ')
  45  
  46  	b = append(b, name...)
  47  	if info.IsDir() {
  48  		b = append(b, '/')
  49  	}
  50  
  51  	return []byte(b)
  52  }
  53  
  54  // FormatDirEntry returns a formatted version of dir for human readability.
  55  // Implementations of [DirEntry] can call this from a String method.
  56  // The outputs for a directory named subdir and a file named hello.go are:
  57  //
  58  //	d subdir/
  59  //	- hello.go
  60  func FormatDirEntry(dir DirEntry) []byte {
  61  	name := dir.Name()
  62  	b := []byte{:0:5+len(name)}
  63  
  64  	// The Type method does not return any permission bits,
  65  	// so strip them from the string.
  66  	mode := dir.Type().String()
  67  	mode = mode[:len(mode)-9]
  68  
  69  	b = append(b, mode...)
  70  	b = append(b, ' ')
  71  	b = append(b, name...)
  72  	if dir.IsDir() {
  73  		b = append(b, '/')
  74  	}
  75  	return []byte(b)
  76  }
  77