/**
* Copyright (c) 2011 Cloudsmith Inc. and other contributors, as listed below.
* 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:
* Cloudsmith
*
*/
package org.cloudsmith.geppetto.forge.util;
import java.util.List;
import org.cloudsmith.geppetto.diagnostic.Diagnostic;
import org.cloudsmith.geppetto.forge.v2.model.Metadata;
import org.cloudsmith.geppetto.forge.v2.model.ModuleName;
import org.jrubyparser.SourcePosition;
import org.jrubyparser.ast.RootNode;
/**
* A Modulefile parser that only accepts strict entries and adds them
* to a Metadata instance
*/
public class StrictModulefileParser extends ModulefileParser {
private final Metadata md;
public StrictModulefileParser(Metadata md) {
this.md = md;
}
private void addDependency(String name, String versionRequirement, SourcePosition pos) {
md.getDependencies().add(createDependency(name, versionRequirement, pos));
}
@Override
protected void call(CallSymbol key, SourcePosition pos, List<Argument> args) {
int nargs = args.size();
switch(nargs) {
case 1:
String arg = args.get(0).toStringOrNull();
switch(key) {
case author:
md.setAuthor(arg);
break;
case dependency:
addDependency(arg, null, pos);
break;
case description:
md.setDescription(arg);
break;
case license:
md.setLicense(arg);
break;
case name: {
ModuleName name = createModuleName(arg, false, pos);
md.setName(name);
setNameSeen();
setFullName(name);
break;
}
case project_page:
md.setProjectPage(arg);
break;
case source:
md.setSource(arg);
break;
case summary:
md.setSummary(arg);
break;
case version:
md.setVersion(createVersion(arg, pos));
setVersionSeen();
break;
case dependencies:
noResponse(key.name(), pos, 1);
}
break;
case 2:
case 3:
if(key == CallSymbol.dependency) {
addDependency(args.get(0).toStringOrNull(), args.get(1).toStringOrNull(), pos);
if(nargs == 3)
addWarning(pos, "Ignoring third argument to dependency");
break;
}
// Fall through
default:
noResponse(key.name(), pos, 0);
}
}
@Override
public void parseRubyAST(RootNode root, Diagnostic diagnostics) {
md.getDependencies().clear();
md.getTypes().clear();
md.getChecksums().clear();
super.parseRubyAST(root, diagnostics);
}
}