4
4
"errors"
5
5
"flag"
6
6
"fmt"
7
+ "io"
7
8
"io/fs"
8
9
"log"
9
10
"os"
@@ -29,9 +30,76 @@ func main() {
29
30
if _ , err := os .Stat (dirPath ); errors .Is (err , fs .ErrExist ) {
30
31
log .Fatal ("can't make directory: " , err )
31
32
}
32
- err := os .Mkdir (dirPath , 0644 )
33
+ err := os .Mkdir (dirPath , 0700 )
33
34
if err != nil {
34
35
log .Fatal ("error while creating directory: " , err )
35
36
}
37
+ err = copyTemplate (dirPath )
38
+ if err != nil {
39
+ log .Fatal ("error while copying template files: " , err )
40
+ }
41
+ }
42
+ }
43
+
44
+ func copyTemplate (targetDir string ) error {
45
+ cwd , err := os .Getwd ()
46
+ if err != nil {
47
+ log .Fatal ("error while getting working directory: " , err )
48
+ }
49
+ configFname := path .Join (cwd , "template" , "sketch.json" )
50
+ appFname := path .Join (cwd , "template" , "main.go" )
51
+ exists , err := regularFileExists (configFname )
52
+ if err != nil {
53
+ return fmt .Errorf ("error while checking for config file: %v" , err )
54
+ }
55
+ if ! exists {
56
+ return fmt .Errorf ("config file %s doesn't exist" , configFname )
57
+ }
58
+ exists , err = regularFileExists (appFname )
59
+ if err != nil {
60
+ return fmt .Errorf ("error while checking for config file: %v" , err )
61
+ }
62
+ if ! exists {
63
+ return fmt .Errorf ("app file %s doesn't exist" , appFname )
64
+ }
65
+ err = copyFile (configFname , path .Join (targetDir , "sketch.json" ))
66
+ if err != nil {
67
+ return fmt .Errorf ("error while copying config file: %v" , err )
68
+ }
69
+ err = copyFile (appFname , path .Join (targetDir , "main.go" ))
70
+ if err != nil {
71
+ return fmt .Errorf ("error while copying app file: %v" , err )
72
+ }
73
+ return nil
74
+ }
75
+
76
+ func regularFileExists (fname string ) (bool , error ) {
77
+ stat , err := os .Stat (fname )
78
+ if err == nil {
79
+ return stat .Mode ().IsRegular (), nil
80
+ } else {
81
+ if errors .Is (err , fs .ErrNotExist ) {
82
+ return false , nil
83
+ }
84
+ }
85
+ return false , err
86
+ }
87
+
88
+ func copyFile (src string , dst string ) error {
89
+ srcFd , err := os .Open (src )
90
+ if err != nil {
91
+ return err
92
+ }
93
+ defer srcFd .Close ()
94
+ dstFd , err := os .Create (dst )
95
+ if err != nil {
96
+ return err
97
+ }
98
+ defer dstFd .Close ()
99
+ _ , err = io .Copy (dstFd , srcFd )
100
+ if err != nil {
101
+ return err
36
102
}
103
+ err = dstFd .Sync ()
104
+ return err
37
105
}
0 commit comments