diff options
author | Leonid Logvinov <logvinov.leon@gmail.com> | 2018-04-10 04:23:25 +0800 |
---|---|---|
committer | Leonid Logvinov <logvinov.leon@gmail.com> | 2018-04-12 18:52:48 +0800 |
commit | eb89926cee2c50ef657b3c033b5637f527d73c6a (patch) | |
tree | 6a4ece7902c860bfa48ac53033baf86ba25683d0 /packages/resolver/src/resolvers/name_resolver.ts | |
parent | 7923ff4ac6d03adf3787a2a3e6f7deb6aa38fc73 (diff) | |
download | dexon-sol-tools-eb89926cee2c50ef657b3c033b5637f527d73c6a.tar dexon-sol-tools-eb89926cee2c50ef657b3c033b5637f527d73c6a.tar.gz dexon-sol-tools-eb89926cee2c50ef657b3c033b5637f527d73c6a.tar.bz2 dexon-sol-tools-eb89926cee2c50ef657b3c033b5637f527d73c6a.tar.lz dexon-sol-tools-eb89926cee2c50ef657b3c033b5637f527d73c6a.tar.xz dexon-sol-tools-eb89926cee2c50ef657b3c033b5637f527d73c6a.tar.zst dexon-sol-tools-eb89926cee2c50ef657b3c033b5637f527d73c6a.zip |
Implement the resolver
Diffstat (limited to 'packages/resolver/src/resolvers/name_resolver.ts')
-rw-r--r-- | packages/resolver/src/resolvers/name_resolver.ts | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/packages/resolver/src/resolvers/name_resolver.ts b/packages/resolver/src/resolvers/name_resolver.ts new file mode 100644 index 000000000..522e10142 --- /dev/null +++ b/packages/resolver/src/resolvers/name_resolver.ts @@ -0,0 +1,66 @@ +import * as fs from 'fs'; +import * as _ from 'lodash'; +import * as path from 'path'; + +import { ContractSource } from '../types'; + +import { EnumerableResolver } from './enumerable_resolver'; + +export class NameResolver extends EnumerableResolver { + private _contractsDir: string; + constructor(contractsDir: string) { + super(); + this._contractsDir = contractsDir; + } + public resolveIfExists(lookupContractName: string): ContractSource | undefined { + const SOLIDITY_FILE_EXTENSION = '.sol'; + let contractSource: ContractSource | undefined; + const onFile = (filePath: string) => { + const contractName = path.basename(filePath, SOLIDITY_FILE_EXTENSION); + if (contractName === lookupContractName) { + const source = fs.readFileSync(filePath).toString(); + contractSource = { + source, + path: filePath, + }; + return true; + } + return undefined; + }; + this._traverseContractsDir(this._contractsDir, onFile); + return contractSource; + } + public getAllContracts(): ContractSource[] { + const SOLIDITY_FILE_EXTENSION = '.sol'; + const contractSources: ContractSource[] = []; + const onFile = (filePath: string) => { + const contractName = path.basename(filePath, SOLIDITY_FILE_EXTENSION); + const source = fs.readFileSync(filePath).toString(); + const contractSource = { + source, + path: filePath, + }; + contractSources.push(contractSource); + }; + this._traverseContractsDir(this._contractsDir, onFile); + return contractSources; + } + // tslint:disable-next-line:prefer-function-over-method + private _traverseContractsDir(dirPath: string, onFile: (filePath: string) => true | void): boolean { + let dirContents: string[] = []; + try { + dirContents = fs.readdirSync(dirPath); + } catch (err) { + throw new Error(`No directory found at ${dirPath}`); + } + for (const fileName of dirContents) { + const entryPath = path.join(dirPath, fileName); + const isDirectory = fs.lstatSync(entryPath).isDirectory(); + const isComplete = isDirectory ? this._traverseContractsDir(entryPath, onFile) : onFile(entryPath); + if (isComplete) { + return isComplete; + } + } + return false; + } +} |