package amntfs import ( "git.swzry.com/ProjectNagae/FsUtils/mountree" "github.com/GUAIK-ORG/go-snowflake/snowflake" "github.com/spf13/afero" ) var _ afero.Fs = (*AMNTFS)(nil) type AMNTFS struct { mountTree *mountree.SimpleUnixLikePathTree[*MountNode] snowflaker *snowflake.Snowflake } func NewAMNTFS() *AMNTFS { sn, err := snowflake.NewSnowflake(0, 0) if err != nil { panic(err) } fs := &AMNTFS{ mountTree: mountree.NewSimpleUnixLikePathTree[*MountNode](), snowflaker: sn, } return fs } func (fs *AMNTFS) Mount(path string, childFs afero.Fs, forceRemountExists bool) error { node := &MountNode{ mountId: fs.snowflaker.NextVal(), mountPoint: path, filesystemType: childFs.Name(), filesystem: childFs, } err := fs.mountTree.Mount(path, node, forceRemountExists) if err != nil { if mountree.CheckErrorType(err, mountree.ErrMountPointAlreadyExists) { return NewAMNTFSError(ErrMountPointAlreadyMounted, nil) } else { return NewAMNTFSError(ErrUnknownInternalError, err) } } return nil } func (fs *AMNTFS) Umount(path string) error { err := fs.mountTree.Umount(path) if err != nil { if mountree.CheckErrorType(err, mountree.ErrMountPointNotExists) { return NewAMNTFSError(ErrMountPointAlreadyMounted, nil) } else { return NewAMNTFSError(ErrUnknownInternalError, err) } } return nil } func (fs *AMNTFS) ListAllMount() []MountInfoEntity { mil := make([]MountInfoEntity, 0) fs.mountTree.ListAllMount(func(path string, payload *MountNode) { mil = append(mil, MountInfoEntity{ MountId: payload.MountId(), MountPoint: payload.MountPoint(), FsType: payload.FsType(), }) }) return mil } func (fs *AMNTFS) getMountEntity(path string) (*MountNode, string) { p, remain, err := fs.mountTree.GetPayload(path) if err != nil { return nil, "" } return *p, remain }