예제 #1
0
        /// <summary>
        /// Finds a number of resources based on a search string. To include more than one resource in
        /// the search, use the wildcard character (asterisk '*'). For example: To find all resources in a namespace
        /// 'MyApplication.Utilities', use the search string "myapplication.utilities.*" or any case
        /// variant of it.
        /// </summary>
        /// <param name="searchString">The case insensitive string to use for the search</param>
        /// <returns></returns>
        public IResource[] SafeFindResources(string searchString)
        {
            switch (searchString.Count(i => i == '*'))
            {
            case 0:
                if (TryFindResource(searchString, out var resource, out _))
                {
                    return new[] { resource }
                }
                ;
                return(new IResource[0]);

            case 1 when searchString.Last() != '*':
                throw new Exception("Invalid resource string syntax. The asterisk must be the last character");

            case 1:
                var commonPart     = searchString.TrimEnd('*');
                var commonPartDots = commonPart.Count(c => c == '.');
                return(ResourceByName
                       .Where(pair => pair.Key.StartsWith(commonPart, StringComparison.OrdinalIgnoreCase) &&
                              pair.Key.Count(c => c == '.') == commonPartDots)
                       .Select(pair => pair.Value)
                       .ToArray());

            default: throw new Exception("Invalid resource string syntax. Can only include one asterisk (*)");
            }
        }
예제 #2
0
 internal static void RemoveResource(IResource toRemove)
 {
     ResourceByName.Remove(toRemove.Name);
     ResourceByType.Remove(toRemove.Type);
     ReloadResourceFinder();
     UpdateConfiguration();
 }
예제 #3
0
        internal bool RemoveResource(IResource toRemove)
        {
            var r = ResourceByName.Remove(toRemove.Name);

            ResourceByType.Remove(toRemove.Type);
            ReloadResourceFinder();
            RootAccess.Load();
            return(r);
        }
예제 #4
0
        public Resource GetResourceByName(FullName resourceName)
        {
            ProfileResourceContentTypes types =
                ResourceByName.FirstOrDefault(
                    resourceEntry => resourceEntry.Key == resourceName)
                .Value;

            return(types.Readable ?? types.Writable);
        }
예제 #5
0
 public void Clear()
 {
     ResourceFinder.Clear();
     ResourceByName.Clear();
     ResourceByType.Clear();
 }
예제 #6
0
 /// <summary>
 /// Finds a resource by name (case insensitive) and returns null
 /// if no resource is found
 /// </summary>
 public IResource SafeGetResource(string name) => ResourceByName.SafeGet(name);
예제 #7
0
 /// <summary>
 /// Finds a resource by name (case insensitive) and throws an UnknownResource exception
 /// if no resource is found.
 /// </summary>
 public IResource GetResource(string name) => ResourceByName.SafeGet(name) ?? throw new UnknownResource(name);
예제 #8
0
 public bool ResourceIsWritable(FullName resourceName) => ResourceByName.Any(
     resourceEntry => resourceEntry.Key == resourceName &&
     resourceEntry.Value.Writable != null);