13 1081cf75 2024-11-04 o "olowe.co/apub/lemmy"
16 1081cf75 2024-11-04 o type FS struct {
17 1081cf75 2024-11-04 o Client *lemmy.Client
21 1081cf75 2024-11-04 o func (fsys *FS) start() error {
22 1081cf75 2024-11-04 o if fsys.Client == nil {
23 1081cf75 2024-11-04 o fsys.Client = &lemmy.Client{}
25 1081cf75 2024-11-04 o fsys.started = true
29 1081cf75 2024-11-04 o func (fsys *FS) Open(name string) (fs.File, error) {
30 1081cf75 2024-11-04 o if !fs.ValidPath(name) {
31 1081cf75 2024-11-04 o return nil, &fs.PathError{"open", name, fs.ErrInvalid}
32 1081cf75 2024-11-04 o } else if strings.Contains(name, `\`) {
33 1081cf75 2024-11-04 o return nil, &fs.PathError{"open", name, fs.ErrInvalid}
35 1081cf75 2024-11-04 o name = path.Clean(name)
37 1081cf75 2024-11-04 o if !fsys.started {
38 1081cf75 2024-11-04 o if err := fsys.start(); err != nil {
39 1081cf75 2024-11-04 o return nil, fmt.Errorf("start fs: %w", err)
42 1081cf75 2024-11-04 o if name == "." {
43 1081cf75 2024-11-04 o return fsys.openRoot()
46 1081cf75 2024-11-04 o elems := strings.Split(name, "/")
47 1081cf75 2024-11-04 o // We've only got communities, then posts/comments.
48 1081cf75 2024-11-04 o // Anything deeper cannot exist.
49 1081cf75 2024-11-04 o if len(elems) > 3 {
50 1081cf75 2024-11-04 o return nil, &fs.PathError{"open", name, fs.ErrNotExist}
53 1081cf75 2024-11-04 o community, _, err := fsys.Client.LookupCommunity(elems[0])
54 1081cf75 2024-11-04 o if errors.Is(err, lemmy.ErrNotFound) {
55 1081cf75 2024-11-04 o return nil, &fs.PathError{"open", name, fs.ErrNotExist}
56 1081cf75 2024-11-04 o } else if err != nil {
57 1081cf75 2024-11-04 o return nil, &fs.PathError{"open", name, err}
59 1081cf75 2024-11-04 o if len(elems) == 1 {
61 1081cf75 2024-11-04 o info: &community,
62 1081cf75 2024-11-04 o buf: io.NopCloser(strings.NewReader(community.Name())),
63 1081cf75 2024-11-04 o client: fsys.Client,
67 1081cf75 2024-11-04 o id, err := strconv.Atoi(elems[1])
68 1081cf75 2024-11-04 o if err != nil {
69 1081cf75 2024-11-04 o return nil, &fs.PathError{"open", name, fmt.Errorf("bad post id")}
71 1081cf75 2024-11-04 o post, err := fsys.Client.LookupPost(id)
72 1081cf75 2024-11-04 o if errors.Is(err, lemmy.ErrNotFound) {
73 1081cf75 2024-11-04 o return nil, &fs.PathError{"open", name, fs.ErrNotExist}
74 1081cf75 2024-11-04 o } else if err != nil {
75 1081cf75 2024-11-04 o return nil, &fs.PathError{"open", name, err}
77 1081cf75 2024-11-04 o if len(elems) == 2 {
80 1081cf75 2024-11-04 o buf: io.NopCloser(strings.NewReader(post.Name())),
81 1081cf75 2024-11-04 o client: fsys.Client,
84 1081cf75 2024-11-04 o if elems[2] == "post" {
85 1081cf75 2024-11-04 o info, err := postFile(&post).Stat()
86 1081cf75 2024-11-04 o if err != nil {
87 1081cf75 2024-11-04 o return nil, &fs.PathError{"open", name, fmt.Errorf("prepare post file info: %w", err)}
91 1081cf75 2024-11-04 o buf: io.NopCloser(postText(&post)),
92 1081cf75 2024-11-04 o client: fsys.Client,
96 1081cf75 2024-11-04 o id, err = strconv.Atoi(elems[2])
97 1081cf75 2024-11-04 o if err != nil {
98 1081cf75 2024-11-04 o return nil, &fs.PathError{"open", name, fmt.Errorf("bad comment id")}
100 1081cf75 2024-11-04 o comment, err := fsys.Client.LookupComment(id)
101 1081cf75 2024-11-04 o if errors.Is(err, lemmy.ErrNotFound) {
102 1081cf75 2024-11-04 o return nil, &fs.PathError{"open", name, fs.ErrNotExist}
103 1081cf75 2024-11-04 o } else if err != nil {
104 1081cf75 2024-11-04 o return nil, &fs.PathError{"open", name, err}
106 1081cf75 2024-11-04 o return &lFile{
107 1081cf75 2024-11-04 o info: &comment,
108 1081cf75 2024-11-04 o buf: io.NopCloser(commentText(&comment)),
109 1081cf75 2024-11-04 o client: fsys.Client,
113 1081cf75 2024-11-04 o func (fsys *FS) openRoot() (fs.File, error) {
114 1081cf75 2024-11-04 o dirinfo := new(dirInfo)
115 1081cf75 2024-11-04 o communities, err := fsys.Client.Communities(lemmy.ListAll)
116 1081cf75 2024-11-04 o if err != nil {
117 1081cf75 2024-11-04 o return nil, err
119 1081cf75 2024-11-04 o for _, c := range communities {
121 1081cf75 2024-11-04 o dent := fs.FileInfoToDirEntry(&c)
122 1081cf75 2024-11-04 o dirinfo.entries = append(dirinfo.entries, dent)
124 1081cf75 2024-11-04 o return &dummy{
126 1081cf75 2024-11-04 o mode: fs.ModeDir | 0444,
127 1081cf75 2024-11-04 o contents: []byte("hello, world!"),
128 1081cf75 2024-11-04 o dirinfo: dirinfo,
129 1081cf75 2024-11-04 o mtime: time.Now(),