/*******************************************************************************
* Copyright (c) 2015 Bruno Medeiros and other Contributors.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Bruno Medeiros - initial API and implementation
*******************************************************************************/
package com.github.rustdt.tooling.cargo;
import java.nio.file.Path;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import com.github.rustdt.tooling.cargo.CargoManifest.CrateDependencyRef;
import com.moandjiezana.toml.Toml;
import melnorme.lang.tooling.bundle.FileRef;
import melnorme.utilbox.collections.ArrayList2;
import melnorme.utilbox.core.CommonException;
import melnorme.utilbox.core.CoreUtil;
import melnorme.utilbox.misc.PathUtil;
public class CargoManifestParser {
public static enum FAllowNull { YES, NO ; public boolean isTrue() { return this == YES; } }
public static final Path MANIFEST_FILENAME = PathUtil.createValidPath("Cargo.toml");
protected MapHelper helper = new MapHelper();
public CargoManifest parse(String source) throws CommonException {
Toml toml = new Toml().read(source);
Map<String, Object> manifestMap = toml.toMap();
Map<String, Object> packageEntry = helper.getTable(manifestMap, "package", FAllowNull.NO);
String name = helper.getString(packageEntry, "name", FAllowNull.NO);
String version = helper.getString(packageEntry, "version", FAllowNull.YES);
ArrayList2<CrateDependencyRef> deps = parseDeps(manifestMap);
FileRef libraryTarget = parseLibraryTarget(manifestMap);
ArrayList2<FileRef> binaries = parseBinaries(manifestMap, "bin");
ArrayList2<FileRef> tests = parseBinaries(manifestMap, "test");
return new CargoManifest(
name,
version,
deps,
libraryTarget,
binaries,
tests
);
}
protected FileRef parseLibraryTarget(Map<String, Object> map) throws CommonException {
Map<String, Object> libEntry = helper.getTable(map, "lib", FAllowNull.YES);
if(libEntry != null) {
return parseFileRef(helper, libEntry);
}
return null;
}
protected ArrayList2<CrateDependencyRef> parseDeps(Map<String, Object> manifestMap) throws CommonException {
ArrayList2<CrateDependencyRef> deps = new ArrayList2<>();
Map<String, Object> depsMap = helper.getTable(manifestMap, "dependencies", FAllowNull.YES);
if(depsMap != null) {
for(Entry<String, Object> depsEntry : depsMap.entrySet()) {
String name = depsEntry.getKey();
Object value = depsEntry.getValue();
if(value instanceof Map<?, ?>) {
Map<String, Object> map = CoreUtil.blindCast(value);
deps.add(parseDependencyRef(helper, name, map));
continue;
}
String version = null;
if(value instanceof String) {
version = (String) value;
}
deps.add(new CrateDependencyRef(name, version));
}
}
return deps;
}
protected CrateDependencyRef parseDependencyRef(MapHelper helper, String name, Map<String, Object> map) {
String version = helper.getValue_ignoreErrors(map, "version", String.class, null);
boolean optional = helper.getValue_ignoreErrors(map, "optional", Boolean.class, false);
return new CrateDependencyRef(name, version, optional);
}
protected ArrayList2<FileRef> parseBinaries(Map<String, Object> manifestMap, String keyName)
throws CommonException {
ArrayList2<FileRef> fileRefs = new ArrayList2<>();
List<Object> binaries = helper.getList(manifestMap, keyName, FAllowNull.YES);
if(binaries != null) {
for(Object binary : binaries) {
if(binary instanceof Map<?, ?>) {
Map<String, Object> map = CoreUtil.blindCast(binary);
fileRefs.add(parseFileRef(helper, map));
continue;
} else {
// Log error?
}
}
}
return fileRefs;
}
protected FileRef parseFileRef(MapHelper helper, Map<String, Object> map) {
String name = helper.getValue_ignoreErrors(map, "name", String.class, "");
String path = helper.getValue_ignoreErrors(map, "path", String.class, null);
return new FileRef(name, path);
}
}