| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 | using CsvHelper.Configuration;using InABox.Core;using System.Collections.Generic;using System.Linq.Expressions;using System.Text;namespace InABox.Poster.CSV;public interface ICSVClassMap{    ClassMap ClassMap { get; }}public interface ICSVClassMap<T> : ICSVClassMap{    new ClassMap<T> ClassMap { get; }    ClassMap ICSVClassMap.ClassMap => ClassMap;    void Map(string name, Expression<Func<T, object>> expr);}public class CSVClassMap<T> : ClassMap<T>, ICSVClassMap<T>{    public ClassMap<T> ClassMap => this;    public void Map(string name, Expression<Func<T, object>> expr)    {        Map(expr).Name(name);    }}public interface ICSVExport<TPostable> : IPostResult<TPostable>    where TPostable : IPostable{    Type Type { get; }    ICSVClassMap ClassMap { get; }    IEnumerable<object> Records { get; }}public interface ICSVExport<TExport, TPostable> : ICSVExport<TPostable>    where TExport : class    where TPostable : IPostable{    new Type Type => typeof(TExport);    new CSVClassMap<TExport> ClassMap { get; }    new IEnumerable<TExport> Records { get; }    Type ICSVExport<TPostable>.Type => Type;    ICSVClassMap ICSVExport<TPostable>.ClassMap => ClassMap;    IEnumerable<object> ICSVExport<TPostable>.Records => Records;}public class CSVExport<TExport, TPostable> : ICSVExport<TExport, TPostable>    where TExport : class    where TPostable : IPostable{    public CSVClassMap<TExport> ClassMap { get; } = new CSVClassMap<TExport>();    public IEnumerable<TExport> Records => items.Where(x => x.Item2.PostedStatus == PostedStatus.Posted).Select(x => x.Item1);    private List<Tuple<TExport, TPostable>> items = new List<Tuple<TExport, TPostable>>();    private Dictionary<Type, List<IPostableFragment<TPostable>>> fragments = new Dictionary<Type, List<IPostableFragment<TPostable>>>();    public IEnumerable<TPostable> PostedEntities => items.Select(x => x.Item2);    public IEnumerable<KeyValuePair<Type, IEnumerable<IPostableFragment<TPostable>>>> Fragments =>        fragments.Select(x => new KeyValuePair<Type, IEnumerable<IPostableFragment<TPostable>>>(x.Key, x.Value));    public void DefineMapping(List<Tuple<string, Expression<Func<TExport, object>>>> mappings)    {        foreach(var (name, expr) in mappings)        {            ClassMap.Map(name, expr);        }    }    public void Map(string name,  Expression<Func<TExport, object>> expr)    {        ClassMap.Map(name, expr);    }    public void AddSuccess(TExport export, TPostable postable)    {        postable.Post();        items.Add(new(export, postable));    }}/// <summary>/// Defines an interface for posters that can export to CSV./// </summary>/// <typeparam name="TEntity"></typeparam>[Caption("CSV")]public interface ICSVPoster<TEntity> : IPoster<TEntity, CSVPosterSettings>    where TEntity : Entity, IPostable, IRemotable, IPersistent, new(){    bool BeforePost(IDataModel<TEntity> model);    ICSVExport<TEntity> Process(IDataModel<TEntity> model);    void AfterPost(IDataModel<TEntity> model, IPostResult<TEntity> result);}
 |