main.Read   A
last analyzed

Complexity

Conditions 2

Size

Total Lines 18
Code Lines 13

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 13
nop 1
dl 0
loc 18
rs 9.75
c 0
b 0
f 0
1
package main
2
3
import (
4
	"encoding/json"
5
	"os"
6
	"os/user"
7
	"path/filepath"
8
)
9
10
var dataFolder = ".hget/"
11
var stateFileName = "state.json"
12
13
// State holds information about url Parts
14
type State struct {
15
	URL   string
16
	Parts []Part
17
}
18
19
// Part represents a chunk of downloaded file
20
type Part struct {
21
	Index     int64
22
	URL       string
23
	Path      string
24
	RangeFrom int64
25
	RangeTo   int64
26
}
27
28
// Save stores downloaded file into disk
29
func (s *State) Save() error {
30
	//make temp folder
31
	//only working in unix with env HOME
32
	folder := FolderOf(s.URL)
33
	Printf("Saving current download data in %s\n", folder)
34
	if err := MkdirIfNotExist(folder); err != nil {
35
		return err
36
	}
37
38
	//move current downloading file to data folder
39
	for _, part := range s.Parts {
40
		err := os.Rename(part.Path, filepath.Join(folder, filepath.Base(part.Path)))
41
		if err != nil {
42
			return err
43
		}
44
	}
45
46
	//save state file
47
	j, err := json.Marshal(s)
48
	if err != nil {
49
		return err
50
	}
51
	return os.WriteFile(filepath.Join(folder, stateFileName), j, 0644)
52
}
53
54
// Read loads data about the state of downloaded files
55
func Read(task string) (*State, error) {
56
	usr, err := user.Current()
57
	FatalCheck(err)
58
	homeDir := usr.HomeDir
59
60
	// extract filename from task
61
	taskName := TaskFromURL(task)
62
63
	file := filepath.Join(homeDir, dataFolder, taskName, stateFileName)
64
	Printf("Getting data from %s\n", file)
65
	bytes, err := os.ReadFile(file)
66
	if err != nil {
67
		return nil, err
68
	}
69
70
	s := new(State)
71
	err = json.Unmarshal(bytes, s)
72
	return s, err
73
}
74