Skip to content

Commit

Permalink
refactor: reorganize error handling
Browse files Browse the repository at this point in the history
  • Loading branch information
gszr committed Jul 23, 2023
1 parent d66e077 commit 8f8940e
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 40 deletions.
22 changes: 9 additions & 13 deletions dot_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ func TestDoLink(t *testing.T) {
To: "out/bashrc",
}

m.doLink()
assert.Nil(t, m.doLink())
assert.True(t, isSymlink(m.To))
}

Expand Down Expand Up @@ -59,9 +59,8 @@ func TestDoCopy(t *testing.T) {
To: "out/bashrc",
}

ok, err := m.doCopy()
err := m.doCopy()
assert.Nil(t, err)
assert.True(t, ok)
assert.False(t, isSymlink(m.To))

// same contents
Expand All @@ -88,9 +87,9 @@ func TestUnmap(t *testing.T) {
From: "examples/bashrc",
To: "out/bashrc",
}
m.doLink()
assert.Nil(t, m.doLink())

assert.Nil(t, m.unmap())
m.unmap()
assert.False(t, pathExists(m.To))
}

Expand All @@ -106,7 +105,7 @@ func TestDoMap(t *testing.T) {
As: "link",
}

assert.Nil(t, m.domap())
m.domap()
assert.True(t, isSymlink(m.To))

// creates path
Expand All @@ -119,7 +118,7 @@ func TestDoMap(t *testing.T) {
As: "copy",
}

assert.Nil(t, m.domap())
m.domap()
assert.False(t, isSymlink(m.To))

// same contents
Expand Down Expand Up @@ -161,9 +160,8 @@ func TestValidate(t *testing.T) {
},
},
}
ok, errs := d.validate()
errs := d.validate()
assert.Nil(t, errs)
assert.True(t, ok)

// invalid dots: path does not exist
d = Dots{
Expand All @@ -176,8 +174,7 @@ func TestValidate(t *testing.T) {
},
},
}
ok, errs = d.validate()
assert.False(t, ok)
errs = d.validate()
assert.Equal(t, len(errs), 1)
assert.Contains(t, errs, fmt.Errorf("%s: path does not exist", d.FileMappings[0].From))

Expand All @@ -193,8 +190,7 @@ func TestValidate(t *testing.T) {
},
},
}
ok, errs = d.validate()
assert.False(t, ok)
errs = d.validate()
assert.Equal(t, len(errs), 1)
assert.Contains(t, errs, fmt.Errorf("%s: cannot use copy type with directory", d.FileMappings[0].From))
}
Expand Down
54 changes: 27 additions & 27 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -50,44 +50,36 @@ type FileMapping struct {
Os string
}

// TODO return error - caller handles error
func (m FileMapping) doLink() {
func (m FileMapping) doLink() error {
err := os.Symlink(m.From, m.To)
if err != nil {
logger.Fatalf("failed linking %s -> %s: %v", m.From, m.To, err)
}
if flagVerbose {
logger.Printf("linking %s -> %s\n", m.From, m.To)
return err
}
return nil
}

// TODO return error - caller handles error
func (m FileMapping) doCopy() (bool, error) {
func (m FileMapping) doCopy() error {
fin, err := os.Open(m.From)
if err != nil {
log.Fatalf("failed opening file %s, %v", m.From, err)
return err
}
defer fin.Close()

fout, err := os.Create(m.To)
if err != nil {
log.Fatalf("failed creating file %s, %v", m.From, err)
return err
}
defer fout.Close()

_, err = io.Copy(fout, fin)
if err != nil {
log.Fatalf("failed copying file %s to %s, %v", m.From, m.To, err)
}
if flagVerbose {
logger.Printf("copying %s -> %s\n", m.From, m.To)
return err
}

return true, nil
return nil
}

// TODO return error - caller handles
func (m FileMapping) unmap() error {
func (m FileMapping) unmap() {
if dstExists := pathExists(m.To); !dstExists && flagVerbose {
logger.Printf("rm %s: skipping, file not there\n", m.To)
} else {
Expand All @@ -99,23 +91,31 @@ func (m FileMapping) unmap() error {
logger.Printf("rm %s: success\n", m.To)
}
}
return nil
}

// TODO return error - caller handles
func (m FileMapping) domap() error {
func (m FileMapping) domap() {
handleDoMapRes := func(m FileMapping, err error) {
if err != nil {
logger.Fatalf("failed %s %s -> %s: %v", m.As+"ing", m.From, m.To, err)
}
if flagVerbose {
logger.Printf("%s %s -> %s\n", m.As+"ing", m.From, m.To)
}
}

// ensure destination path exists
if err := createPath(m.To); err != nil {
logger.Fatalf("failed creating path %s, %v", m.To, err)
}

switch typ := m.As; typ {
case "link":
m.doLink()
err := m.doLink()
handleDoMapRes(m, err)
case "copy":
m.doCopy()
err := m.doCopy()
handleDoMapRes(m, err)
}
return nil
}

func (m FileMapping) isMatchingOs() bool {
Expand Down Expand Up @@ -155,7 +155,7 @@ func (d *Dots) UnmarshalYAML(unmarshal func(interface{}) error) error {
return nil
}

func (dots Dots) validate() (bool, []error) {
func (dots Dots) validate() []error {
var errs []error
for _, mapping := range dots.FileMappings {
if !pathExists(mapping.From) {
Expand All @@ -164,7 +164,7 @@ func (dots Dots) validate() (bool, []error) {
errs = append(errs, fmt.Errorf("%s: cannot use copy type with directory", mapping.From))
}
}
return len(errs) == 0, errs
return errs
}

func inferDestination(file string) string {
Expand Down Expand Up @@ -289,8 +289,8 @@ func readDotFile(file string) Dots {
}

newDots := dots.transform()
valid, errs := newDots.validate()
if !valid {
errs := newDots.validate()
if len(errs) > 0 {
for _, err := range errs {
logger.Printf("failed validating dots file: %v", err)
}
Expand Down

0 comments on commit 8f8940e

Please sign in to comment.