forked from kevinburke/go-bindata
-
Notifications
You must be signed in to change notification settings - Fork 0
/
asset.go
99 lines (85 loc) · 2.11 KB
/
asset.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
// This work is subject to the CC0 1.0 Universal (CC0 1.0) Public Domain Dedication
// license. Its contents can be found at:
// http://creativecommons.org/publicdomain/zero/1.0/
package xbindata
import (
"crypto/sha256"
"fmt"
"os"
"time"
"github.com/moisespsena-go/xbindata/digest"
"github.com/djherbis/times"
)
// Asset holds information about a single asset to be processed.
type Asset struct {
Path string // Full file path.
Name string // Key used in TOC -- name by which asset is referenced.
Func string // Function name for the procedure returning the asset contents.
Size int64
Prefix string
info os.FileInfo
ctime time.Time
digest *[sha256.Size]byte
}
func (a *Asset) Info() (info os.FileInfo, err error) {
if a.info != nil {
return a.info, nil
}
if a.info, err = os.Stat(a.Path); err != nil {
return
}
t := times.Get(a.info)
a.ctime = t.ChangeTime()
return a.info, nil
}
func (a *Asset) InfoExport(c *Config) (string, error) {
fi, err := a.Info()
if err != nil {
return "", err
}
mode := uint(fi.Mode())
modTime := fi.ModTime().Unix()
changeTime := a.ctime.Unix()
size := fi.Size()
if c.NoMetadata {
mode = 0
modTime = 0
size = 0
changeTime = 0
}
if c.Mode > 0 {
mode = uint(os.ModePerm) & c.Mode
}
if c.ChangeTime > 0 {
changeTime = c.ChangeTime
}
return fmt.Sprintf("%d, os.FileMode(%d), time.Unix(%d, 0), time.Unix(%d, 0)", size, mode, modTime, changeTime), nil
}
func (a *Asset) SourceCode(c *Config, start int64) (code string, err error) {
digest, err := a.Digest()
if err != nil {
return "", err
}
var readerFunc string
if c.Outlined {
readerFunc = fmt.Sprintf("newOpener(%d, %d)", start, a.Size)
} else {
readerFunc = fmt.Sprintf("%sReader", a.Func)
}
info, err := a.InfoExport(c)
if err != nil {
return "", err
}
return fmt.Sprintf("bc.NewFile(bc.NewFileInfo(%q, %s), %s, func()[sha256.Size]byte{return %#v})",
a.Name, info, readerFunc, *digest), nil
}
func (a *Asset) Digest() (dig *[sha256.Size]byte, err error) {
if a.digest != nil {
return a.digest, nil
}
if dig, err = digest.Digest(a.Path); err != nil {
return
}
a.digest = dig
return
}