summaryrefslogtreecommitdiff
path: root/app/src/main/java/org/the_jk/cleversync/io/Utils.kt
blob: 6593d045a0586aab523113c25a5d41413e85f935 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
package org.the_jk.cleversync.io

import org.the_jk.cleversync.StringUtils

object Utils {
    fun makeDirectories(directory: ModifiableDirectory, vararg names: String): ModifiableDirectory {
        var current = directory
        names.forEach { nameWithSlashes ->
            StringUtils.split(nameWithSlashes, '/', keepEmpty = false).forEach { name ->
                current = current.modifiableOpenDir(name) ?: current.createDirectory(name)
            }
        }
        return current
    }

    fun createFileAndDirectories(directory: ModifiableDirectory, vararg names: String): ModifiableFile {
        val (dirNames, fileName) = resolve(*names)
        return makeDirectories(directory, *dirNames).createFile(fileName)
    }

    fun openDirectory(directory: Directory, vararg names: String): Directory? {
        var current = directory
        names.forEach { nameWithSlashes ->
            StringUtils.split(nameWithSlashes, '/', keepEmpty = false).forEach { name ->
                current = current.openDir(name) ?: return null
            }
        }
        return current
    }

    fun openFile(directory: Directory, vararg names: String): File? {
        val (dirNames, fileName) = resolve(*names)
        return openDirectory(directory, *dirNames)?.openFile(fileName)
    }

    fun resolve(vararg names: String): Pair<Array<String>, String> {
        val out = buildList {
            names.forEach { nameWithSlashes ->
                StringUtils.split(nameWithSlashes, '/', keepEmpty = false)
                    .forEach { name ->
                        add(name)
                    }
            }
        }
        return if (out.isEmpty()) { emptyArray<String>() to "" } else {
            val last = out.last()
            out.dropLast(1).toTypedArray() to last
        }
    }
}