public string GetOrReplace(string key, Func<string> func)
{
Func<string> wrappedfunc = () =>
{
var result = func();
if (!string.IsNullOrWhiteSpace(result))
{
return result;
}
var message = string.Format("Could not derive value for '{0}'.", key);
throw new Exception(message);
};
var xDocument = XDocument.Parse(NuspecContent);
var ns = xDocument.Root.GetDefaultNamespace();
var metaData = xDocument.Element(ns + "package").Element(ns + "metadata");
var xElement = metaData.Element(ns + key);
string value;
var searchKey = "$" + key + "$";
if (xElement == null)
{
value = wrappedfunc();
xElement = new XElement(ns + key, value);
metaData.Add(xElement);
}
else
{
if (string.IsNullOrWhiteSpace(xElement.Value))
{
value = xElement.Value = wrappedfunc();
}
else if (xElement.Value.Contains(searchKey))
{
value = xElement.Value.Replace(searchKey, wrappedfunc());
xElement.Value = value;
}
else if (xElement.Value.Contains("$"))
{
value = wrappedfunc();
}
else
{
value = xElement.Value;
}
}
NuspecContent = xDocument.ToString();
NuspecContent.Replace(searchKey, value);
return value;
}