Skip to content

Instantly share code, notes, and snippets.

@richlander

richlander/Program.cs Secret

Last active Oct 14, 2020
Embed
What would you like to do?
Mycroft information access 6.0
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net5.0</TargetFramework>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>
using System;
using System.Collections.Generic;
using static AccessType;
using static ContentType;
Console.WriteLine("Mycroft information access 6.0");
var mycroftCaring = WhoDoesMycroftCareAbout();
foreach (var (user, content, season) in GetRandomData(20))
{
Console.WriteLine($"User: {user.Name}; Content: {content.Name}; Season: {season}; Access: {UserManager.IsAccessOk(user, content, season)}");
}
Person[] GetUsers()
{
return new Person[]
{
new Person("John Watson", AccessType.Adult),
new Person("Mary (Morstan) Watson", AccessType.Adult),
new Person("Rosamund Watson", AccessType.Child),
new Person("Molly Hooper", AccessType.Adult),
new OpenCaseFile("Jim Moriarty", AccessType.PoorlyDefined, 99),
new OpenCaseFile("Sherlock Holmes", AccessType.Adult, 50),
new OpenCaseFile("Eurus Holmes", AccessType.PoorlyDefined, 100),
new Mycroft("Mycroft Holmes", AccessType.Adult){CaresAbout = mycroftCaring},
new Person("Queen Elizabeth II", AccessType.Monarch)
};
}
Content[] GetContents()
{
return new Content[]
{
new Content("Holmes' children nursery rhymes", ContentType.ChildsPlay),
new Content("Magna Carta", ContentType.Public),
new Content("John's blog", ContentType.Public),
new Content("Report on death of Charles Augustus Magnussen", ContentType.StateSecret),
new Content("Meeting of Moriarty and Holmes at Sherrinford", ContentType.StateSecret),
new Content("Lady Adler", ContentType.ForHerEyesOnly),
};
}
IEnumerable<(Person, Content, int)> GetRandomData(int count)
{
Random random = new();
Person[] users = GetUsers();
Content[] content = GetContents();
for (int i = 0; i < count; i++)
{
int userIndex = random.Next(users.Length);
int contentIndex = random.Next(content.Length);
int seasonIndex = random.Next(1,5);
var user = users[userIndex];
if (user is Mycroft m && m.CaresAbout is not object)
{
Console.WriteLine("Mycroft dissapoints us again.");
}
yield return (user, content[contentIndex], seasonIndex);
}
}
string? WhoDoesMycroftCareAbout()
{
string?[] caresAbout = {"Himself", "Dear brother", null};
Random random = new();
return caresAbout[random.Next(0,3)];
}
public class UserManager
{
public static bool IsAccessOk(Person user, Content content, int season)
{
return IsAccessOkOfficial(user, content, season) | IsAccessOKAskMycroft(user);
}
public static bool IsAccessOkOfficial(Person user, Content content, int season) => (user, content, season) switch
{
// Tuple + property patterns
({Type: Child}, {Type: ChildsPlay}, _) => true,
({Type: Child}, _, _) => false,
(_ , {Type: Public}, _) => true,
({Type: Monarch}, {Type: ForHerEyesOnly}, _) => true,
// Tuple + type patterns
(OpenCaseFile f, {Type: ChildsPlay}, 4) when f.Name == "Sherlock Holmes" => true,
// Property and type patterns
{Item1: OpenCaseFile {Type: var type}, Item2: {Name: var name}}
when type == PoorlyDefined && name.Contains("Sherrinford") && season >= 3 => true,
// Tuple and type patterns
(OpenCaseFile, var c, 4) when c.Name.Contains("Sherrinford") => true,
// Tuple, Type, Property and logical patterns
(OpenCaseFile {RiskLevel: >50 and <100 }, {Type: StateSecret}, 3) => true,
_ => false,
};
public static bool IsAccessOKAskMycroft(Person person) => person switch
{
// Type pattern
OpenCaseFile f when f.Name == "Jim Moriarty" => true,
// Simple type pattern
Mycroft => true,
_ => false,
};
}
public record Person (string Name, AccessType Type);
public record OpenCaseFile (string Name, AccessType Type, int RiskLevel) : Person(Name, Type);
public record Mycroft (string Name, AccessType Type): Person(Name, Type)
{
public string? CaresAbout { get; set; }
};
public record Content(string Name, ContentType Type);
public enum AccessType
{
Child,
Adult,
PoorlyDefined,
Monarch,
}
public enum ContentType
{
ChildsPlay,
Public,
StateSecret,
ForHerEyesOnly
}
@richlander

This comment has been minimized.

Copy link
Owner Author

@richlander richlander commented Oct 13, 2020

Output of program:

D:\mi6>bin\Debug\net5.0\mia.exe
Mycroft information access 6.0
User: Sherlock Holmes; Content: Meeting of Moriarty and Holmes at Sherrinford; Season: 4; Access: True
User: Queen Elizabeth II; Content: Magna Carta; Season: 1; Access: True
User: Molly Hooper; Content: Meeting of Moriarty and Holmes at Sherrinford; Season: 1; Access: False
User: Queen Elizabeth II; Content: Holmes' children nursery rhymes; Season: 4; Access: False
User: Mycroft Holmes; Content: Report on death of Charles Augustus Magnussen; Season: 4; Access: True
User: John Watson; Content: Lady Adler; Season: 3; Access: False
User: Mycroft Holmes; Content: Meeting of Moriarty and Holmes at Sherrinford; Season: 3; Access: True
User: Queen Elizabeth II; Content: Lady Adler; Season: 2; Access: True
User: Sherlock Holmes; Content: Holmes' children nursery rhymes; Season: 1; Access: False
User: Molly Hooper; Content: Holmes' children nursery rhymes; Season: 3; Access: False
User: Eurus Holmes; Content: John's blog; Season: 1; Access: True
User: Mary (Morstan) Watson; Content: Meeting of Moriarty and Holmes at Sherrinford; Season: 4; Access: False
User: Mary (Morstan) Watson; Content: Lady Adler; Season: 3; Access: False
User: Mycroft Holmes; Content: Magna Carta; Season: 4; Access: True
User: Eurus Holmes; Content: Holmes' children nursery rhymes; Season: 4; Access: False
User: Queen Elizabeth II; Content: Report on death of Charles Augustus Magnussen; Season: 4; Access: False
User: Rosamund Watson; Content: Report on death of Charles Augustus Magnussen; Season: 2; Access: False
User: Mycroft Holmes; Content: Lady Adler; Season: 3; Access: True
User: Molly Hooper; Content: Report on death of Charles Augustus Magnussen; Season: 4; Access: False
User: Jim Moriarty; Content: Magna Carta; Season: 2; Access: True
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.