src/Service/path.tree.ts
import { ISubtree } from './path.tree';
import { logger } from './../Log/Logger';
import { Path } from './path';
export interface ITree {
[index: string] : ISubtree
}
export interface ISubtree {
subtree: ITree;
fn?: () => any
}
export class PathTree {
tree: any;
serializedTree: object;
plainTree: any;
constructor () {
this.tree = {
'': {
subtree: {}
}
}
this.serializedTree = { '': {} }
this.plainTree = []
}
/**
* Note that the service layer is responsible for
* 1- validating this path
* 2- formatting it to standard value
*/
createPathSubtree (path, fn: () => void) {
let tokens = Path.getTokens(path)
let tree = this.tree
let stree = this.serializedTree
for (let token of tokens) {
if (tree[token] === undefined) {
tree[token] = {subtree: {}}
}
if (token !== tokens[tokens.length - 1]) {
tree = tree[token].subtree
} else {
tree = tree[token]
}
if (stree[token] === undefined) {
stree[token] = {}
}
stree = stree[token]
}
if (fn) {
tree.fn = fn
}
this.plainTree.push({path: path, name: fn['name'] || 'anonymousFN'})
return true
}
/**
* Will return the function accosiated with a path.
* Note that this function will be used at the receiver of a message.
* It expects a RESOLVED path (no * included)
*/
getPathFunction (path) {
let pathTokens = path.split('/')
let tree = this.tree[pathTokens[0]]
let token
for (let i = 1; i < pathTokens.length; i++) {
token = pathTokens[i]
if (tree.subtree[token]) {
tree = tree.subtree[token]
} else {
return false
}
}
return tree.fn
}
getPathFunctions (path) {
let pathTokens = path.split('/')
let tree = this.tree[pathTokens[0]]
let token
let fns = []
for (let i = 1; i < pathTokens.length; i++) {
if (tree.fn) {
fns.push(tree.fn)
}
token = pathTokens[i]
if (tree.subtree[token]) {
tree = tree.subtree[token]
}
}
fns.push(tree.fn)
return fns
}
getMatches (path, startTree = this.serializedTree) {}
}