internal/lsp/file_handler.go (71 lines of code) (raw):
package lsp
import (
"path/filepath"
"strings"
lsp "github.com/Azure/azapi-lsp/internal/protocol"
"github.com/Azure/azapi-lsp/internal/uri"
)
func FileHandlerFromDocumentURI(docUri lsp.DocumentURI) *fileHandler {
return &fileHandler{uri: string(docUri)}
}
func FileHandlerFromDirURI(dirUri lsp.DocumentURI) *fileHandler {
// Dir URIs are usually without trailing separator already
// but we do sanity check anyway, so we deal with the same URI
// regardless of language client differences
uri := strings.TrimSuffix(string(dirUri), "/")
return &fileHandler{uri: uri, isDir: true}
}
type FileHandler interface {
Valid() bool
Dir() string
IsDir() bool
Filename() string
DocumentURI() lsp.DocumentURI
URI() string
}
type fileHandler struct {
uri string
isDir bool
}
func (fh *fileHandler) Valid() bool {
return uri.IsURIValid(fh.uri)
}
func (fh *fileHandler) IsDir() bool {
return fh.isDir
}
func (fh *fileHandler) Dir() string {
if fh.isDir {
return fh.FullPath()
}
path := filepath.Dir(fh.FullPath())
return path
}
func (fh *fileHandler) Filename() string {
return filepath.Base(fh.FullPath())
}
func (fh *fileHandler) FullPath() string {
return uri.MustPathFromURI(fh.uri)
}
func (fh *fileHandler) DocumentURI() lsp.DocumentURI {
return lsp.DocumentURI(fh.uri)
}
func (fh *fileHandler) URI() string {
return string(fh.uri)
}
type versionedFileHandler struct {
fileHandler
v int
}
func VersionedFileHandler(doc lsp.VersionedTextDocumentIdentifier) *versionedFileHandler {
return &versionedFileHandler{
fileHandler: fileHandler{uri: string(doc.URI)},
v: int(doc.Version),
}
}
func (fh *versionedFileHandler) Version() int {
return fh.v
}
func FileHandlerFromPath(path string) *fileHandler {
return &fileHandler{uri: uri.FromPath(path)}
}
func FileHandlerFromDirPath(dirPath string) *fileHandler {
// Dir URIs are usually without trailing separator in LSP
dirPath = filepath.Clean(dirPath)
return &fileHandler{uri: uri.FromPath(dirPath), isDir: true}
}