Added content property and reworked FileStream usage

This commit is contained in:
Cameron Cowen 2021-05-03 15:54:18 +01:00
parent 0ec6e10d01
commit ddf4be6e8f
3 changed files with 40 additions and 25 deletions

View file

@ -1,5 +1,7 @@
using Elsa.ActivityResults;
using Elsa.Attributes;
using Elsa.Design;
using Elsa.Expressions;
using Elsa.Services;
using Elsa.Services.Models;
using System;
@ -15,44 +17,44 @@ namespace Elsa.Activities.File
Outcomes = new[] { OutcomeNames.Done })]
public class OutFile : Activity
{
[ActivityProperty(Hint = "Path to create file at.")]
[ActivityProperty(Hint = "Content of the file.", UIHint = ActivityPropertyUIHints.MultiLine, SupportedSyntaxes = new[] { SyntaxNames.JavaScript, SyntaxNames.Liquid })]
public string Content { get; set; }
[ActivityProperty(Hint = "Path to create file at.", UIHint = ActivityPropertyUIHints.SingleLine, SupportedSyntaxes = new[] { SyntaxNames.JavaScript, SyntaxNames.Liquid })]
public string Path { get; set; }
[ActivityProperty(Hint = "How the output file should be written to.")]
[ActivityProperty(Hint = "How the output file should be written to.", UIHint = ActivityPropertyUIHints.Dropdown)]
public CopyMode Mode { get; set; } = CopyMode.CreateNew;
protected async override ValueTask<IActivityExecutionResult> OnExecuteAsync(ActivityExecutionContext context)
{
FileStream fs;
FileMode fileMode;
FileAccess fileAccess;
switch (Mode)
{
case CopyMode.Append:
fs = new FileStream(Path, FileMode.Append, FileAccess.Write);
fileMode = FileMode.Append;
fileAccess = FileAccess.Write;
break;
case CopyMode.Overwrite:
fs = new FileStream(Path, FileMode.Create, FileAccess.ReadWrite);
fileMode = FileMode.Create;
fileAccess = FileAccess.ReadWrite;
break;
case CopyMode.CreateNew:
fs = new FileStream(Path, FileMode.CreateNew, FileAccess.ReadWrite);
fileMode = FileMode.CreateNew;
fileAccess = FileAccess.ReadWrite;
break;
default:
throw new ApplicationException("Unsupported copy mode");
}
try
{
using var sw = new StreamWriter(fs);
await sw.WriteLineAsync((string)context.Input);
await sw.FlushAsync();
await fs.FlushAsync();
using var fs = new FileStream(Path, fileMode, fileAccess);
using var sw = new StreamWriter(fs);
await sw.WriteLineAsync((string)Content);
await sw.FlushAsync();
await fs.FlushAsync();
return Done();
}
finally
{
if (fs != null)
await fs.DisposeAsync();
}
return Done();
}
}
}

View file

@ -13,36 +13,41 @@ namespace Elsa.Activities.File
{
public static IActivityBuilder OutFile(this IBuilder builder, Action<ISetupActivity<OutFile>> setup, [CallerLineNumber] int lineNumber = default, [CallerFilePath] string? sourceFile = default) => builder.Then(setup, null, lineNumber, sourceFile);
public static IActivityBuilder OutFile(this IBuilder builder, Func<ActivityExecutionContext, string> path, Func<ActivityExecutionContext, CopyMode> mode, [CallerLineNumber] int lineNumber = default, [CallerFilePath] string? sourceFile = default) =>
public static IActivityBuilder OutFile(this IBuilder builder, Func<ActivityExecutionContext, string> content, Func<ActivityExecutionContext, string> path, Func<ActivityExecutionContext, CopyMode> mode, [CallerLineNumber] int lineNumber = default, [CallerFilePath] string? sourceFile = default) =>
builder.OutFile(activity => activity
.Set(x => x.Content, content)
.Set(x => x.Path, path)
.Set(x => x.Mode, mode),
lineNumber,
sourceFile);
public static IActivityBuilder OutFile(this IBuilder builder, Func<ActivityExecutionContext, ValueTask<string>> path, Func<ActivityExecutionContext, ValueTask<CopyMode>> mode, [CallerLineNumber] int lineNumber = default, [CallerFilePath] string? sourceFile = default) =>
public static IActivityBuilder OutFile(this IBuilder builder, Func<ActivityExecutionContext, ValueTask<string>> content, Func<ActivityExecutionContext, ValueTask<string>> path, Func<ActivityExecutionContext, ValueTask<CopyMode>> mode, [CallerLineNumber] int lineNumber = default, [CallerFilePath] string? sourceFile = default) =>
builder.OutFile(activity => activity
.Set(x => x.Content, content)
.Set(x => x.Path, path)
.Set(x => x.Mode, mode),
lineNumber,
sourceFile);
public static IActivityBuilder OutFile(this IBuilder builder, Func<string> path, Func<CopyMode> mode, [CallerLineNumber] int lineNumber = default, [CallerFilePath] string? sourceFile = default) =>
public static IActivityBuilder OutFile(this IBuilder builder, Func<string> content, Func<string> path, Func<CopyMode> mode, [CallerLineNumber] int lineNumber = default, [CallerFilePath] string? sourceFile = default) =>
builder.OutFile(activity => activity
.Set(x => x.Content, content)
.Set(x => x.Path, path)
.Set(x => x.Mode, mode),
lineNumber,
sourceFile);
public static IActivityBuilder OutFile(this IBuilder builder, Func<ValueTask<string>> path, Func<ValueTask<CopyMode>> mode, [CallerLineNumber] int lineNumber = default, [CallerFilePath] string? sourceFile = default) =>
public static IActivityBuilder OutFile(this IBuilder builder, Func<ValueTask<string>> content, Func<ValueTask<string>> path, Func<ValueTask<CopyMode>> mode, [CallerLineNumber] int lineNumber = default, [CallerFilePath] string? sourceFile = default) =>
builder.OutFile(activity => activity
.Set(x => x.Content, content)
.Set(x => x.Path, path)
.Set(x => x.Mode, mode),
lineNumber,
sourceFile);
public static IActivityBuilder OutFile(this IBuilder builder, string path, CopyMode mode, [CallerLineNumber] int lineNumber = default, [CallerFilePath] string? sourceFile = default) =>
public static IActivityBuilder OutFile(this IBuilder builder, string content, string path, CopyMode mode, [CallerLineNumber] int lineNumber = default, [CallerFilePath] string? sourceFile = default) =>
builder.OutFile(activity => activity
.Set(x => x.Content, content)
.Set(x => x.Path, path)
.Set(x => x.Mode, mode),
lineNumber,

View file

@ -10,6 +10,14 @@ namespace Elsa.Activities.File
{
public static class OutFileExtensions
{
#region Content
public static ISetupActivity<OutFile> WithContent(this ISetupActivity<OutFile> setup, Func<ActivityExecutionContext, ValueTask<string>> content) => setup.Set(x => x.Content, content);
public static ISetupActivity<OutFile> WithContent(this ISetupActivity<OutFile> setup, Func<ActivityExecutionContext, string> content) => setup.Set(x => x.Content, content);
public static ISetupActivity<OutFile> WithContent(this ISetupActivity<OutFile> setup, Func<ValueTask<string>> content) => setup.Set(x => x.Content, content);
public static ISetupActivity<OutFile> WithContent(this ISetupActivity<OutFile> setup, Func<string> content) => setup.Set(x => x.Content, content);
public static ISetupActivity<OutFile> WithContent(this ISetupActivity<OutFile> setup, string content) => setup.Set(x => x.Content, content);
#endregion
#region Path
public static ISetupActivity<OutFile> WithPath(this ISetupActivity<OutFile> setup, Func<ActivityExecutionContext, ValueTask<string>> path) => setup.Set(x => x.Path, path);
public static ISetupActivity<OutFile> WithPath(this ISetupActivity<OutFile> setup, Func<ActivityExecutionContext, string> path) => setup.Set(x => x.Path, path);
@ -27,4 +35,4 @@ namespace Elsa.Activities.File
#endregion
}
}
}