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);
- }
|