// A Go mirror of libfuse's hello.c 

package main

import (
	"flag"
	"log"
	"github.com/hanwen/go-fuse/fuse"
	"os"
)

type HelloFs struct {
	fuse.DefaultFileSystem
}

func (me *HelloFs) GetAttr(name string) (*os.FileInfo, fuse.Status) {
	switch name {
	case "file.txt":
		return &os.FileInfo{
			Mode: fuse.S_IFREG | 0644, Size: int64(len(name)),
		},fuse.OK
	case "":
		return &os.FileInfo{
			Mode: fuse.S_IFDIR | 0755,
		},fuse.OK
	}
	return nil, fuse.ENOENT
}

func (me *HelloFs) OpenDir(name string) (c chan fuse.DirEntry, code fuse.Status) {
	if name == "" {
		c = make(chan fuse.DirEntry, 1)
		c <- fuse.DirEntry{Name: "file.txt", Mode: fuse.S_IFREG}
		close(c)
		return c, fuse.OK
	}
	return nil, fuse.ENOENT
}

func (me *HelloFs) Open(name string, flags uint32) (file fuse.File, code fuse.Status) {
	if name != "file.txt" {
		return nil, fuse.ENOENT
	}
	if flags&fuse.O_ANYWRITE != 0 {
		return nil, fuse.EPERM
	}
	return fuse.NewReadOnlyFile([]byte(name)), fuse.OK
}

func main() {
	flag.Parse()
	if len(flag.Args()) < 1 {
		log.Fatal("Usage:\n  hello MOUNTPOINT")
	}
	state, _, err := fuse.MountFileSystem(flag.Arg(0), &HelloFs{}, nil)
	if err != nil {
		log.Fatal("Mount fail: %v\n", err)
	}
	state.Loop(true)
}