fishi0x01/vsh

View on GitHub
client/type.go

Summary

Maintainability
A
0 mins
Test Coverage
package client

import (
    "path/filepath"
    "strings"
)

// PathKind describes the type of a path
type PathKind int

// types of paths
const (
    BACKEND PathKind = iota
    NODE
    LEAF
    NONE
)

func (client *Client) topLevelType(path string) PathKind {
    if path == "" {
        return BACKEND
    } else if _, ok := client.KVBackends[path+"/"]; ok {
        return BACKEND
    } else {
        return NONE
    }
}

func (client *Client) isAmbiguous(path string, dirFiles map[string]int) (result bool) {
    // check if path exists as file and directory
    result = false
    if _, ok := dirFiles[filepath.Base(path)]; ok {
        if _, ok := dirFiles[filepath.Base(path)+"/"]; ok {
            result = true
        }
    }
    return result
}

func (client *Client) getDirFiles(path string) (result map[string]int) {
    // get current directory content
    result = make(map[string]int)
    pathTrim := strings.TrimSuffix(path, "/")
    lsPath := client.getKVMetaDataPath(filepath.Dir(pathTrim))
    s, err := client.cache.List(lsPath)
    if err == nil && s != nil {
        if keysInterface, ok := s.Data["keys"]; ok {
            for _, valInterface := range keysInterface.([]interface{}) {
                val := valInterface.(string)
                result[val] = 1
            }
        }
    }
    return result
}

func (client *Client) lowLevelType(path string) (result PathKind) {
    dirFiles := client.getDirFiles(path)
    if client.isAmbiguous(path, dirFiles) {
        if strings.HasSuffix(path, "/") {
            result = NODE
        } else {
            result = LEAF
        }
    } else {
        hasNode := false
        kvPath := client.getKVMetaDataPath(path + "/")
        s, err := client.cache.List(kvPath)
        if err == nil && s != nil {
            if _, ok := s.Data["keys"]; ok {
                hasNode = true
            }
        }
        if hasNode {
            result = NODE
        } else {
            if _, ok := dirFiles[filepath.Base(path)]; ok {
                result = LEAF
            } else {
                result = NONE
            }
        }
    }
    return result
}