Browse Source

Tweaked some feature parsing

Added AddInFeature
pull/46/head
DaNike 5 years ago
parent
commit
1fe7b973bd
7 changed files with 72 additions and 9 deletions
  1. +1
    -0
      IPA.Loader/IPA.Loader.csproj
  2. +21
    -0
      IPA.Loader/Loader/Features/AddInFeature.cs
  3. +2
    -0
      IPA.Loader/Loader/Features/DefineFeature.cs
  4. +21
    -7
      IPA.Loader/Loader/Features/Feature.cs
  5. +18
    -0
      IPA.Loader/Loader/Features/PrintFeature.cs
  6. +6
    -2
      IPA.Loader/Loader/PluginLoader.cs
  7. +3
    -0
      IPA.Loader/Loader/manifest.json

+ 1
- 0
IPA.Loader/IPA.Loader.csproj View File

@ -62,6 +62,7 @@
<Compile Include="Config\IConfigProvider.cs" />
<Compile Include="Config\SelfConfig.cs" />
<Compile Include="Loader\Composite\CompositeBSPlugin.cs" />
<Compile Include="Loader\Features\AddInFeature.cs" />
<Compile Include="Loader\Features\DefineFeature.cs" />
<Compile Include="Loader\Features\NoUpdateFeature.cs" />
<Compile Include="Loader\Features\PrintFeature.cs" />


+ 21
- 0
IPA.Loader/Loader/Features/AddInFeature.cs View File

@ -0,0 +1,21 @@
namespace IPA.Loader.Features
{
internal class AddInFeature : Feature
{
private PluginLoader.PluginMetadata selfMeta;
public override bool Initialize(PluginLoader.PluginMetadata meta, string[] parameters)
{
selfMeta = meta;
RequireLoaded(meta);
return true;
}
public override bool BeforeLoad(PluginLoader.PluginMetadata plugin)
{
return plugin != selfMeta;
}
}
}

+ 2
- 0
IPA.Loader/Loader/Features/DefineFeature.cs View File

@ -7,6 +7,8 @@ namespace IPA.Loader.Features
{
public static bool NewFeature = true;
internal override bool StoreOnPlugin => false;
public override bool Initialize(PluginLoader.PluginMetadata meta, string[] parameters)
{ // parameters should be (name, fully qualified type)
if (parameters.Length != 2)


+ 21
- 7
IPA.Loader/Loader/Features/Feature.cs View File

@ -25,6 +25,14 @@ namespace IPA.Loader.Features
/// <returns><see langword="true"/> if the feature is valid for the plugin, <see langword="false"/> otherwise</returns>
public abstract bool Initialize(PluginLoader.PluginMetadata meta, string[] parameters);
/// <summary>
/// Evaluates the Feature for use in conditional meta-Features. This should be re-calculated on every call, unless it can be proven to not change.
///
/// This will be called on every feature that returns <see langword="true" /> from <see cref="Initialize"/>
/// </summary>
/// <returns>the truthiness of the Feature.</returns>
public virtual bool Evaluate() => true;
/// <summary>
/// The message to be logged when the feature is not valid for a plugin.
/// This should also be set whenever either <see cref="BeforeLoad"/> or <see cref="BeforeInit"/> returns false.
@ -61,11 +69,15 @@ namespace IPA.Loader.Features
/// <param name="plugin">the plugin to ensure is loaded.</param>
protected void RequireLoaded(PluginLoader.PluginMetadata plugin) => PluginLoader.Load(plugin);
internal virtual bool StoreOnPlugin => true;
private static readonly Dictionary<string, Type> featureTypes = new Dictionary<string, Type>
{
{ "define-feature", typeof(DefineFeature) }
};
internal static bool HasFeature(string name) => featureTypes.ContainsKey(name);
internal static bool RegisterFeature(string name, Type type)
{
if (!typeof(Feature).IsAssignableFrom(type))
@ -103,7 +115,7 @@ namespace IPA.Loader.Features
var parameters = new List<string>();
bool escape = false;
bool readingParams = false;
int parens = 0;
bool removeWhitespace = true;
foreach (var chr in featureString)
{
@ -119,18 +131,20 @@ namespace IPA.Loader.Features
case '\\':
escape = true;
break;
case '(' when !readingParams:
case '(':
parens++;
if (parens != 1) goto default;
removeWhitespace = true;
readingParams = true;
name = builder.ToString();
builder.Clear();
break;
case ')' when readingParams:
readingParams = false;
case ')':
parens--;
if (parens != 0) goto default;
goto case ',';
case ',':
if (parens > 1) goto default;
parameters.Add(builder.ToString());
if (!readingParams) break;
builder.Clear();
removeWhitespace = true;
break;
@ -149,7 +163,7 @@ namespace IPA.Loader.Features
parsed = new FeatureParse(name, parameters.ToArray());
if (readingParams)
if (parens != 0)
{
failException = new Exception("Malformed feature definition");
return false;


+ 18
- 0
IPA.Loader/Loader/Features/PrintFeature.cs View File

@ -11,4 +11,22 @@ namespace IPA.Loader.Features
return true;
}
}
internal class DebugFeature : Feature
{
public override bool Initialize(PluginLoader.PluginMetadata meta, string[] parameters)
{
Logger.features.Debug($"{meta.Name}: {string.Join(" ", parameters)}");
return true;
}
}
internal class WarnFeature : Feature
{
public override bool Initialize(PluginLoader.PluginMetadata meta, string[] parameters)
{
Logger.features.Debug($"{meta.Name}: {string.Join(" ", parameters)}");
return true;
}
}
}

+ 6
- 2
IPA.Loader/Loader/PluginLoader.cs View File

@ -322,9 +322,9 @@ namespace IPA.Loader
feature.Item2.Value = parsed;
else if (success)
{
if (valid)
if (valid && featureObj.StoreOnPlugin)
plugin.Item1.InternalFeatures.Add(featureObj);
else
else if (!valid)
Logger.features.Warn(
$"Feature not valid on {plugin.Item1.Name}: {featureObj.InvalidMessage}");
plugin.Item2.RemoveAt(i--);
@ -336,6 +336,10 @@ namespace IPA.Loader
plugin.Item2.RemoveAt(i--);
}
}
foreach (var plugin in PluginsMetadata)
foreach (var feature in plugin.Features)
feature.Evaluate();
}
foreach (var plugin in parsedFeatures)


+ 3
- 0
IPA.Loader/Loader/manifest.json View File

@ -8,7 +8,10 @@
"version": "3.12.0",
"features": [
"define-feature(print, IPA.Loader.Features.PrintFeature)",
"define-feature(debug, IPA.Loader.Features.DebugFeature)",
"define-feature(warn, IPA.Loader.Features.WarnFeature)",
"define-feature(no-update, IPA.Loader.Features.NoUpdateFeature)",
"define-feature(add-in, IPA.Loader.Features.AddInFeature)",
"print(YO! Howz it goin\\, its ya boi desinc here)"
]
}

Loading…
Cancel
Save