rat_quickdns 0.2.4

A high-performance, feature-rich DNS client library with support for multiple transport protocols, load balancing, caching, and filtering
Documentation
//! Tauri集成示例
//! 
//! 演示如何在Tauri应用中集成rat_quickdns和rat_quickmem
//! 注意:此示例仅展示代码结构,需要在实际Tauri项目中使用

// 以下代码应放在Tauri项目的src-tauri/src/dns.rs中

use rat_quickdns::{EasyDnsResolver, DnsQueryRequest, DnsQueryResponse, encode, decode};
use std::sync::Arc;
use tokio::sync::Mutex;

/// DNS解析器状态(全局单例)
pub struct DnsState {
    resolver: Arc<EasyDnsResolver>,
}

impl DnsState {
    pub fn new() -> Result<Self, Box<dyn std::error::Error>> {
        let resolver = EasyDnsResolver::quick_setup()?;
        Ok(Self {
            resolver: Arc::new(resolver),
        })
    }
}

/// Tauri命令:解析域名
#[tauri::command]
pub async fn resolve_domain(
    domain: String,
    record_type: String,
    state: tauri::State<'_, Arc<Mutex<DnsState>>>,
) -> Result<Vec<String>, String> {
    let state = state.lock().await;
    state.resolver
        .resolve_type(&domain, &record_type)
        .await
        .map_err(|e| e.to_string())
}

/// Tauri命令:处理二进制DNS查询(使用bincode2和rat_quickmem)
#[tauri::command]
pub async fn process_dns_query(
    query_data: Vec<u8>,
    state: tauri::State<'_, Arc<Mutex<DnsState>>>,
) -> Result<Vec<u8>, String> {
    let state = state.lock().await;
    state.resolver
        .process_encoded_query(&query_data)
        .await
        .map_err(|e| e.to_string())
}

/// Tauri命令:批量处理DNS查询
#[tauri::command]
pub async fn batch_resolve_domains(
    domains: Vec<String>,
    record_type: String,
    state: tauri::State<'_, Arc<Mutex<DnsState>>>,
) -> Result<Vec<Vec<String>>, String> {
    let state = state.lock().await;
    
    let mut results = Vec::with_capacity(domains.len());
    
    for domain in domains {
        match state.resolver.resolve_type(&domain, &record_type).await {
            Ok(ips) => results.push(ips),
            Err(e) => return Err(format!("解析 {} 失败: {}", domain, e)),
        }
    }
    
    Ok(results)
}

// 以下代码应放在Tauri项目的src-tauri/src/main.rs中

/*
use tauri::Manager;
use std::sync::Arc;
use tokio::sync::Mutex;

mod dns;
use dns::{DnsState, resolve_domain, process_dns_query, batch_resolve_domains};

#[tokio::main]
async fn main() {
    // 初始化DNS解析器
    let dns_state = Arc::new(Mutex::new(
        DnsState::new().expect("Failed to initialize DNS resolver")
    ));
    
    tauri::Builder::default()
        .manage(dns_state)
        .invoke_handler(tauri::generate_handler![
            resolve_domain,
            process_dns_query,
            batch_resolve_domains
        ])
        .run(tauri::generate_context!())
        .expect("error while running tauri application");
}
*/

// 以下代码应放在Tauri项目的src/App.tsx或其他前端文件中

/*
import { invoke } from "@tauri-apps/api/tauri";
import { useState } from "react";

function App() {
  const [domain, setDomain] = useState("");
  const [recordType, setRecordType] = useState("A");
  const [results, setResults] = useState<string[]>([]);
  const [loading, setLoading] = useState(false);

  async function resolveDomain() {
    try {
      setLoading(true);
      const response = await invoke<string[]>("resolve_domain", {
        domain,
        recordType,
      });
      setResults(response);
    } catch (error) {
      console.error(error);
      setResults([`Error: ${error}`]);
    } finally {
      setLoading(false);
    }
  }

  return (
    <div className="container">
      <h1>DNS Resolver</h1>
      
      <div className="row">
        <input
          type="text"
          placeholder="Enter domain (e.g. example.com)"
          value={domain}
          onChange={(e) => setDomain(e.target.value)}
        />
        
        <select 
          value={recordType} 
          onChange={(e) => setRecordType(e.target.value)}
        >
          <option value="A">A</option>
          <option value="AAAA">AAAA</option>
          <option value="CNAME">CNAME</option>
          <option value="MX">MX</option>
          <option value="TXT">TXT</option>
        </select>
        
        <button onClick={resolveDomain} disabled={loading}>
          {loading ? "Resolving..." : "Resolve"}
        </button>
      </div>
      
      <div className="results">
        <h2>Results:</h2>
        {results.length > 0 ? (
          <ul>
            {results.map((result, index) => (
              <li key={index}>{result}</li>
            ))}
          </ul>
        ) : (
          <p>No results yet</p>
        )}
      </div>
    </div>
  );
}

export default App;
*/

// 实际运行示例(仅用于演示)
fn main() {
    println!("这是Tauri集成示例代码,请在实际Tauri项目中使用");
    println!("请参考代码注释了解如何集成到Tauri项目中");
}