Skip to content

Commit

Permalink
Add resource bracket expression
Browse files Browse the repository at this point in the history
Signed-off-by: TheSilkMiner <thesilkminer@outlook.com>
  • Loading branch information
TheSilkMiner committed Jun 18, 2022
1 parent f80319a commit e714eae
Show file tree
Hide file tree
Showing 2 changed files with 49 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ private ContentTweakerBrackets() {}
public static void registerBrackets(final IBracketParserRegistrationHandler handler) {
bracket(handler, "factory", new FactoryBracketExpressionParser(), FactoryBracketExpressionParser::dump);
bracket(handler, "reference", new ReferenceBracketExpressionParser(), ReferenceBracketExpressionParser::dump);
handler.registerParserFor(ContentTweakerConstants.CONTENT_LOADER_ID, "resource", new ResourceLocationBracketExpressionParser(), null);
ContentTweakerCore.core().registerPluginBrackets(handler);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package com.blamejared.contenttweaker.core.zen.bracket;

import com.blamejared.contenttweaker.core.api.zen.bracket.BracketHelper;
import com.blamejared.crafttweaker.api.util.ParseUtil;
import net.minecraft.resources.ResourceLocation;
import org.openzen.zencode.shared.CodePosition;
import org.openzen.zencode.shared.CompileException;
import org.openzen.zenscript.codemodel.partial.IPartialExpression;
import org.openzen.zenscript.codemodel.scope.ExpressionScope;
import org.openzen.zenscript.lexer.ParseException;
import org.openzen.zenscript.lexer.ZSTokenParser;
import org.openzen.zenscript.parser.BracketExpressionParser;
import org.openzen.zenscript.parser.expression.ParsedExpression;

import java.util.Objects;
import java.util.regex.Pattern;

final class ResourceLocationBracketExpressionParser implements BracketExpressionParser {
private static final class ResourceLocationExpression extends ParsedExpression {
private final String location;

ResourceLocationExpression(final CodePosition position, final String namespace, final String path) {
super(position);
this.location = "%s:%s".formatted(Objects.requireNonNull(namespace), Objects.requireNonNull(path));
}

@Override
public IPartialExpression compile(final ExpressionScope scope) throws CompileException {
final ResourceLocation location = BracketHelper.parseToCompile(this.position, () -> BracketHelper.locationOrThrow(this.position, this.location));
return BracketHelper.locationArgument(this.position, location).compile(scope);
}

@Override
public boolean hasStrongType() {
return true;
}
}

@Override
public ParsedExpression parse(final CodePosition position, final ZSTokenParser tokens) throws ParseException {
final String contents = ParseUtil.readBracketContent(position, tokens);
if (contents.indexOf(':') == -1) {
throw new IllegalStateException("Expected resource bracket in the format <resource:modid:path>, but found <resource:%s>".formatted(contents));
}
final String[] split = contents.split(Pattern.quote(":"), 2);
return new ResourceLocationExpression(position, split[0], split[1]);
}
}

0 comments on commit e714eae

Please sign in to comment.