123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- using System;
- using System.IO;
- using System.Linq;
- using UnityEditor;
- using UnityEngine;
- using Object = UnityEngine.Object;
- namespace LLM.Editor.Analysis
- {
- /// <summary>
- /// Finds assets in the project. Supports both standard AssetDatabase queries
- /// and file path glob patterns.
- /// </summary>
- public class FindAssetsProvider : IContextProvider
- {
- public class AssetInfo
- {
- public string guid;
- public string path;
- public string name;
- }
- public object GetContext(Object target, string qualifier)
- {
- if (string.IsNullOrEmpty(qualifier))
- {
- return "Error: A query string (qualifier) is required for FindAssets.";
- }
- // If the query contains wildcards or path separators, use glob search.
- if (qualifier.Contains("*") || qualifier.Contains("/"))
- {
- return FindAssetsByGlob(qualifier);
- }
-
- // Otherwise, use the default AssetDatabase search.
- return FindAssetsByQuery(qualifier);
- }
- private object FindAssetsByGlob(string pattern)
- {
- try
- {
- var assetsPath = Application.dataPath;
- var absolutePatternPath = Path.GetDirectoryName(Path.Combine(assetsPath, pattern));
- var searchPattern = Path.GetFileName(pattern);
- if (!Directory.Exists(absolutePatternPath))
- {
- return $"Error: Directory does not exist for glob pattern: {absolutePatternPath}";
- }
- var files = Directory.GetFiles(absolutePatternPath, searchPattern, SearchOption.AllDirectories);
-
- return files.Select(fullPath =>
- {
- // Make path relative to Assets folder
- var relativePath = "Assets" + fullPath.Substring(assetsPath.Length);
- var guid = AssetDatabase.AssetPathToGUID(relativePath);
- return new AssetInfo
- {
- guid = guid,
- path = relativePath,
- name = Path.GetFileName(relativePath)
- };
- }).Where(info => !string.IsNullOrEmpty(info.guid)).ToArray();
- }
- catch (Exception e)
- {
- return $"Error during glob search: {e.Message}";
- }
- }
- private object FindAssetsByQuery(string query)
- {
- var guids = AssetDatabase.FindAssets(query);
- if (guids != null && guids.Length > 0)
- {
- return guids.Select(guid =>
- {
- var path = AssetDatabase.GUIDToAssetPath(guid);
- return new AssetInfo
- {
- guid = guid,
- path = path,
- name = Path.GetFileName(path)
- };
- }).ToArray();
- }
- // Handle direct GUID lookup as a fallback
- if (query.Contains("guid:"))
- {
- var guid = query.Replace("guid:", "").Trim();
- var path = AssetDatabase.GUIDToAssetPath(guid);
- if (!string.IsNullOrEmpty(path))
- {
- return new[] { new AssetInfo { guid = guid, path = path, name = Path.GetFileName(path) } };
- }
- }
- return Array.Empty<AssetInfo>();
- }
- }
- }
|