using System;
using System.IO;
using System.Linq;
using UnityEditor;
using UnityEngine;
using Object = UnityEngine.Object;
namespace LLM.Editor.Analysis
{
///
/// Finds assets in the project. Supports both standard AssetDatabase queries
/// and file path glob patterns.
///
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();
}
}
}