Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 3c2332c

Browse files
committed
feat: tags
1 parent 7aedb97 commit 3c2332c

File tree

1 file changed

+54
-13
lines changed

1 file changed

+54
-13
lines changed

pkg/leetcode/leetcode.go

Lines changed: 54 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"errors"
66
"fmt"
77
"github.com/zcong1993/leetcode-tool/internal/config"
8+
"io"
89
"io/ioutil"
910
"net/http"
1011
"os"
@@ -13,6 +14,8 @@ import (
1314
"github.com/tidwall/gjson"
1415
)
1516

17+
const RemoteProblems = "https://raw.githubusercontent.com/PPsteven/leetcode-tool/master/data/problems.json"
18+
1619
type Meta struct {
1720
Index string
1821
Title string
@@ -47,10 +50,43 @@ func NewLeetcode(config *config.Config) *Leetcode {
4750
return &Leetcode{Config: config}
4851
}
4952

53+
func DownloadFile(remoteFile string) error {
54+
// Create the file
55+
out, err := os.Create("data/problems.json")
56+
if err != nil {
57+
return err
58+
}
59+
defer out.Close()
60+
61+
resp, err := http.Get(remoteFile)
62+
if err != nil {
63+
return err
64+
}
65+
defer resp.Body.Close()
66+
67+
// Write the body to file
68+
_, err = io.Copy(out, resp.Body)
69+
if err != nil {
70+
return err
71+
}
72+
73+
return nil
74+
}
75+
5076
func (l *Leetcode) getAllProblem() ([]byte, error) {
51-
file, err := ioutil.ReadFile("/Users/ppsteven/Projects/leetcode-tool/data/problems.json")
52-
if err == os.ErrNotExist {
53-
return nil, errors.New("234324")
77+
file, err := ioutil.ReadFile("data/problems.json")
78+
if err != nil && errors.Is(err, os.ErrNotExist) {
79+
fmt.Println(fmt.Sprintf("file problems.json not exists, start downloading from %s", RemoteProblems))
80+
err = DownloadFile(RemoteProblems)
81+
82+
if err != nil {
83+
return nil, fmt.Errorf("download file failed: %v", err)
84+
}
85+
file, err := ioutil.ReadFile("data/problems.json")
86+
if err != nil {
87+
return nil, fmt.Errorf("read file failed: %v", err)
88+
}
89+
return file, nil
5490
}
5591
return file, nil
5692
}
@@ -97,16 +133,21 @@ func (l *Leetcode) GetMetaByNumber(number string) (*Meta, error) {
97133
}
98134

99135
func (l *Leetcode) GetTags() ([]Tag, error) {
100-
resp, err := http.Get("https://leetcode-cn.com/problems/api/tags/")
101-
if err != nil {
102-
return nil, err
136+
if l.Problems == nil {
137+
l.Problems, _ = l.getAllProblem()
103138
}
104-
defer resp.Body.Close()
105-
bt, err := ioutil.ReadAll(resp.Body)
106-
if err != nil {
107-
return nil, err
139+
140+
tags := make([]Tag, 0)
141+
tagsMap := make(map[string]Tag)
142+
for _, problem := range gjson.ParseBytes(l.Problems).Map() {
143+
_ = json.Unmarshal([]byte(problem.Get("topicTags").Raw), &tags)
144+
for _, tag := range tags {
145+
tagsMap[tag.Slug] = tag
146+
}
147+
}
148+
tags = make([]Tag, 0, len(tagsMap))
149+
for _, tag := range tagsMap {
150+
tags = append(tags, tag)
108151
}
109-
res := make([]Tag, 0)
110-
err = json.Unmarshal([]byte(gjson.GetBytes(bt, "topics").Raw), &res)
111-
return res, err
152+
return tags, nil
112153
}

0 commit comments

Comments
 (0)