From 63ba97e7ff918e0aea54edfe5eef4a463747837e Mon Sep 17 00:00:00 2001 From: Charles Iliya Krempeaux Date: Wed, 14 Dec 2022 03:56:49 -0800 Subject: [PATCH] initial commits --- regularfile.go | 100 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 regularfile.go diff --git a/regularfile.go b/regularfile.go new file mode 100644 index 0000000..076205b --- /dev/null +++ b/regularfile.go @@ -0,0 +1,100 @@ +package strfs + +import ( + "io/fs" + "time" +) + +// RegularFile lets you turn a string into a fs.File. +// +// Example usage: +// +// var content strfs.Content = strfs.CreateContent(""+"\n"+"Hello world!") +// +// var regularfile strfs.RegularFile = strfs.RegularFile{ +// FileContent: content, +// FileName: "helloworld.html", +// FileModTIme: time.Date(2022, 12, 12, 10, 30, 14, 2, time.UTC), +// } +type RegularFile struct { + FileContent Content + FileName string + FileModTime time.Time +} + +// A trick to make sure strfs.RegularFile fits the fs.File interface. +// This is a compile-time check. +var _ fs.File = &RegularFile{} + +// Close will stop the Read method from working. +// +// Close can safely be called more than once. +// +// Close helps strfs.RegularFile fit the fs.File interface. +// Close makes strfs.RegularFile fit the io.Closer interface. +func (receiver *RegularFile) Close() error { + if nil == receiver { + return errNilReceiver + } + + return receiver.FileContent.Close() +} + +// Read reads up to len(p) bytes into 'p'. +// Read returns the number of bytes actually read, and any errors it encountered. +// +// Read helps strfs.RegularFile fit the fs.File interface. +// Read makes strfs.Content fit the io.Reader interface. +// +// Example usage: +// +// var content strfs.Content = strfs.CreateContent("ABCDEFGHIJKLMNOPQRSTUVWXYZ") +// +// var regularfile strfs.RegularFile = strfs.RegularFile{ +// FileContent: content, +// FileName: "alphabet.txt", +// FileModTime: time.Now(), +// } +// +// var b1 [5]byte +// var p1 []byte = b1[:] +// +// n, err := regularfile.Read(p1) +// +// // n == 5 +// // b1 == [5]byte{'A', 'B', 'C', 'D', 'E'} +// +// // ... +// +// var b2 [4]byte +// var p2 []byte = b2[:] +// +// n, err := regularfile.Read(p2) +// +// // n == 4 +// // b2 == [5]byte{'F', 'G', 'H', 'I'} +func (receiver *RegularFile) Read(p []byte) (int, error) { + if nil == receiver { + return 0, errNilReceiver + } + + return receiver.FileContent.Read(p) +} + +// Stat returns a fs.FileInfo for a *strfs.RegularFile. +// +// Stat helps strfs.RegularFile fit the fs.File interface. +func (receiver *RegularFile) Stat() (fs.FileInfo, error) { + if nil == receiver { + return nil, errNilReceiver + } + + const modeRegularFile = 0 + + return internalFileInfo{ + name: receiver.FileName, + size: receiver.FileContent.Size(), + mode: modeRegularFile, + modtime: receiver.FileModTime, + }, nil +}