]> git.wincent.com - wincent.git/blob - src/Fig/operations/file.ts
457caa103efd6e5d015f8b3aa1f203e23f011d4d
[wincent.git] / src / Fig / operations / file.ts
1 import {promises as fs} from 'fs';
2
3 import ErrorWithMetadata from '../../ErrorWithMetadata';
4 import {log} from '../../console';
5 import expand from '../../expand';
6 import stat from '../../stat';
7 import Context from '../Context';
8
9 // TODO decide whether we want a separate "directory" operation
10 export default async function file({
11     force,
12     mode,
13     path,
14     src,
15     state,
16 }: {
17     path: string;
18     mode?: Mode;
19     src?: string;
20     state: 'directory' | 'file' | 'link' | 'touch';
21     force?: boolean;
22 }): Promise<void> {
23     if (state === 'directory') {
24         await directory(path);
25     }
26 }
27
28 async function directory(path: string) {
29     const target = expand(path);
30
31     const stats = await stat(target);
32
33     if (stats instanceof Error) {
34         throw stats;
35     } else if (stats === null) {
36         Context.informChanged(`directory ${path}`);
37         await fs.mkdir(target, {recursive: true});
38     } else if (stats.type === 'directory') {
39         // TODO: check ownership, perms etc
40         Context.informOk(`directory ${path}`);
41     } else {
42         // TODO: find out if ansible replaces regular file with dir or just errors?
43         throw new ErrorWithMetadata(
44             `${path} already exists but is not a directory`
45         );
46     }
47 }